Практична рефлексія C++26 для Protobuf

Нова редакція стандарту C++, випуск якої очікується у нинішньому, 2026 році, додасть в C++ рефлексію (reflection). Це дозволить розробникам писати код, який досліджуватиме властивості класів, типів, функцій, та інших елементів і робити у них зміни. На момент написання статті, рефлексія хоча і не підтримується основними гілками компіляторів, проте доступна у відгалуженнях як clang так і gcc, які можна зібрати самостійно. Для експериментів нашвидкоруч можна також скористатись Compiler Explorer .

У оглядових статтях та відео на цю тему найпоширеніший приклад — друкування довільних структур чи їх серіалізація в JSON. В рамках цієї статті автор пропонує читачу повправлятися разом з автором із дещо складнішим прикладом — десеріалізацією із protobuf: Практична рефлексія C++26 для Protobuf

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

👍ПодобаєтьсяСподобалось2
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Whole new language © Hana Dusíková

Як для бувшого програміста на старому С++, карета перетворюється на гарбузу Perl з усіма дванадцять разів перевантаженими спецсимволами замість кейвордів.

Переклад українською кареті геть не допомагає.

Наприклад, access_context::unchecked з прикладу коду геть не зрозуміло. Ну, код. А що цей код робить і навіщо?

анотації - це значення часу компіляції перша думка — а чим не підходять старі макроси __TIME__ та __DATE__?

Приклади коду монополотном без порожніх рядків та з коментами в правій частині також не читаються — бо не видно структури.

В прикладі з протобуфом також порядок подання коду навиворіт: зазвичай і в програмі, і в навчанні дають простенькі шматочки, а тоді з них збирають робочу програму. У вас зворотній порядок — показали програму, котра робить незрозуміло що, викликаючи купу невідомих методів, а тоді по-одному показують ці методи — коли ти вже забув, який з них що мав би робить.

Себто, імовірно, що матеріал цінний, і був би гарним оглядом можливостей рефлексії на практиці, але подання більше наукове, ніж науково-популярне.

Дякую що знайшли час ознайомитись. Спробую відповісти на ваші концерни.
access_context::unchecked — функція що повертає access_context без обмежень прав доступу. Сам access_context це репрезентація місця коду, з якого ми хочемо добратись до членів класу. Якщо член приватний, а контекст публічний, то доступу зась, а якщо контекст unchecked, то права не перевіряються і обмеження не застосовуються.

Значення часу компіляції — в розумінні compile-time values, тобто значення доступні лише в часовий відрізок коли відбувається компіляція. Хоча і в англійській теж присутня ця лінгвістична неоднозначність і можна інтерпретувати ідіому як дату і час компіляції, проте загально прийнята інтерпретація саме як час коли програма компілюється.

Якщо починати із простеньких функцій то теж будуть питання — а навіщо вони потрібні? як вони допоможуть у вирішенні задачі?
А так ми абстрагувались від деталей, написали функцію, окреслили що потрібно дописати і поступово дописали.

Ну дивіться. В найпершій з дрібніших функцій створюється std::vector<field_reader_type<Message>>. При цьому в статті ніде нема означення field_reader_type. І що далі? Як це читати?

Погоджуюсь, таке означення слід було б додати. Поки що визначимо `field_reader_type` як тип вказівника на функцію `field_reader`

Підписатись на коментарі