יום שלישי, ינואר 20, 2026

כמה שאני מחכה לחלק מהפיטצ'רים של C++26 והפעם static reflection

באופן כללי אני חושב ש C++ היא שפה מדהימה, ולפעמים השיפורים שמגיעים מגיעים מאוד לאט , אבל כשהם מגיעים , הולי שיט. 
 
נכון להיות אני מתחזק מערכת לניהול טיפוסים מדובר על מערכת שאני מתחזק שהיא בסדר גודל של כ 12K שורות , של קוד שהוא בסופו של יום , בדיקה כפולה, יש אומרים שזה נראה כמו בית זיקוק (זה ביטויי לקוד מאוד גדול, ומסובך שמייצר משהוא מאוד נדרש) , אנשים שראו את זה אמרו שזה משהוא מאוד טוב, ואחרים אמרו שראו דברים דומים במימושים ב ADA , לא אני המצאתי אותו, אבל אני מתחזק אותו, המקרה שלי הוא מקרה קצה, מרבית האנשים לא צריכים את זה כלל, אבל אני צריך , וזה עונה על הצרכים.
 
היום ראיתי את התוסף המדהים של static reflection שמוסיפים בC++, כן אני ידוע שדברים כאלה היו קיימים דרך macros , ושזה אפשרי בצורות שונות תחת boost, ויש פרוייקטים עצמאיים, מה שאני אומר זה שאני שמח שזה חלק מהשפה, וכן אני יודע שזה קיים בשפות אחרות, ידוע לי .
 
סוף סוף אנחנו יכולים להגיע למצב שאנחנו עושים את הדבר הבא:

 
template <typename E> requires std::is_enum_v<E>
constexpr std::string enum_to_string(E value) { 
  template for (constexpr auto e: std::meta::enumeratorts_of(^^E)) { 
     if ([:e:] == value) {
        return std::string(std::meta::name_of(e));
        }
     }
     return "invalid";
}

enum Color {eRED, eGREEN, eBLUE};
static_assert(enum_to_string(Color::eRED) == "eRED");
static_assert(enum_to_string(42) == "invalid");

דוגמאות הקוד הזאת שייכת למרק גרגורי והצגה ב cppcon 2025, אבל מוצגת גם ב P2996r0 

מדובר על פתרון כל כך פשוט ואלגנטי, נכון שזה כבר קיים במערכות אחרות, ובשפות אחרות, אבל זה די משמח שזה סוף סוף הגיע אליינו, זה מאפשר לי ליצור בדיקות קומפילציה נוספות כמו פעם , ולהקטין את העומס של הספרייה שאני מתחזק. האם זה לבד יחליף את הכל ? ממש לא אבל הייכולת הזאת תקל על החיים שלי מאוד בקלות. אני הולך להחליף המון קוד כפול ומאקרויים  במקטעי קוד קטנים יותר. 

עכשיו, מי שכותב ב C++ מנוהל קצת יתעצבן בגלל השימוש ב ^, כי זה דורש התייחסות שונה לסימן, כן בעסה, אבל תודה לאל אני כבר לא צריך להתמודד עם הדבר הזה יותר.

עכשיו חשוב לציין שזה בה להחליף את ה reflection TS שכבר הוצא חלקית, ונראה לי שאף מומש על ידי אנשים שונים כמו דרך N4818 

לפי הבנתי זה אמור להגיע ל g++ בגרסה הבאה, אז עוד חמש שנים בדביאן ויכול להיות בגרסה הקרובה של פדורה, מתי זה יהיה ב Visual Studio ? 

אין תגובות: