Задать вопрос
@ImagineTables

Как сделать простую рефлексию (стрингизацию имён типов) на C++23?

Есть таблица:

struct Settings
{
    struct Category1
    {
        static Type<int> Value1;
        static Type<bool> Value2;
    };
    struct Category2
    {
        static Type<Str> Value3;
        static Type<double> Value4;
    };
};


Конструктор Type<> принимает помимо дефолтного значения для настройки две строки: имя категории и имя настройки (они используются для сериализации). Эти строки должны совпадать с именем родительской структуры (например, Category1) и именем переменной (например, Value1). Важно, что инициализация элементов Settings обязательно должна быть вынесена в отдельный .cpp-файл (дефолтное значение настройки может быть задано лямбдой и ссылаться на функции из разных частей проекта, так что файл будет включать в себя почти все хедеры).

Что можно использовать кроме макросов?
  • Вопрос задан
  • 198 просмотров
Подписаться 1 Средний Комментировать
Помогут разобраться в теме Все курсы
  • Нетология
    Разработчик на C++
    12 месяцев
    Далее
  • Академия Эдюсон
    Разработчик игр на Unreal Engine + ИИ
    9 месяцев
    Далее
  • Бруноям
    Разработчик на C++
    5 месяцев
    Далее
Решения вопроса 1
opium
@opium
Просто люблю качественно работать
в C++23 нормальной рефлексии нет вообще, P2996 (static reflection) это C++26, и то экспериментально: GCC 16 за флагом -freflection, у Clang свой форк от Bloomberg. Без макросов ближе всего трюк из nameof-cpp/magic_enum: указатель на статический член как NTTP, внутри шаблона парсишь __PRETTY_FUNCTION__ (или std::source_location::current().function_name()), там будет полное квалифицированное имя вроде Settings::Category1::Value1, откуда constexpr-парсером режешь и категорию, и имя настройки одним заходом.

p.s. формат этой строки implementation-defined, для сериализации это риск на будущее, так что кодогенерация тут надёжнее чем экономия на макросах
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы