Как стать автором
Обновить

Комментарии 7

Ну значит плюсанём и там :)
На самом деле есть много способов. Один из них не так давно рассматривался на Хабре.
Но самое удивительное — есть способы организации полной рефлексии не только на современном С++, но и на чистом Си, причем времен создания языка (70-х годов!).

Есть способ на boost::preprocessor, который в общем не зависит от того, Си это или С++. Достаточно навороченный способ, требующий большой отдельной статьи.

А есть еще один способ, невероятно простой и прозрачный — основанный на двойном include заголовочого файла; элементы синтаксической конструкции (не только перечисления, но и например структуры) объявляются с помощью специальных макросов, которые в зависимости от некоторой макропеременной раскрываются или в обычные элементы (имя перечисления, идентификаторы элементов и т.д.), или в элементы статического массива данных рефлекси.

#ifdef GENERATE_REFLECTION
#define ENUM_ITEM(item, data) data, 
#else
#define ENUM_ITEM(item, data) item, 
#endif

Ну а дальше очевидно: везде используется обычное подключение заголовочного файла с перечислением, и только в одном единственном месте (точке инстанцирования, которая должна быть .c или .cpp файлом) предварительно объявляется макрос и создается статический объект рефлексии

#include "my_enum.h"
#define GENERATE_REFLECTION
#include "my_enum.h"
#undef GENERATE_REFLECTION
По-моему круче всего было бы просто сделать плагин к clang'у и добавить какой-нибудь атрибут. Была ещё экспериментальная версия Qtшного moc'а в виде плагина. Вообще идеально выглядело бы что-то такое:

[[display(prefix="my_")]]
enum { first_item, second_item }
Круче всего было бы если бы рефлексию добавили в C++17
Но почему-то не заметно, чтобы это произошло.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий