Войти
ПрограммированиеФорумОбщее

C++, enum reflection (enum.hpp) (2 стр)

Страницы: 1 2 3 Следующая »
#15
18:30, 21 ноя. 2019

Dimich
Vlad2001_MFS
> Немного шаблонной магии + парсинг макроса __PRETTY_FUNCTION__

Т.е. требуется gcc не ниже 9-й версии. Но впечатление производит сильное, да. Именно, что магия.

#16
19:07, 21 ноя. 2019

Есть подозрение что примерно тоже самое можно запилить на typeid и constexpr
с несколько меньшими требованиями к компилятору, но это не точно.

#17
19:09, 21 ноя. 2019

nes
typeid - runtime only.

#18
19:09, 21 ноя. 2019

BingoBongo
Ну значит нет )

#19
(Правка: 19:11) 19:10, 21 ноя. 2019

BingoBongo
Еще можно попробовать обмазаться компиляторопроверками и компиляторорасширениями.

#20
20:53, 21 ноя. 2019

nes
> Еще можно попробовать обмазаться компиляторопроверками
Или просто написать матчер для llvm

#21
7:14, 22 ноя. 2019

Добавил возможность регать для шаблонного контекста и возможность добавлять треитсы для внешних енумов.

Generic context

namespace
{
    ENUM_HPP_CLASS_DECL(color, unsigned,
        (red = 0xFF0000)
        (green = 0x00FF00)
        (blue = 0x0000FF)
        (white = red | green | blue))
}

// register traits in global namespace to generic access
ENUM_HPP_REGISTER_TRAITS(color)

int main()
{
    // to string
    static_assert(enum_hpp::to_string(color::red) == "red");

    // from string
    static_assert(enum_hpp::from_string<color>("red") == color::red);

    return 0;
}

Adapting external enums

namespace external_ns
{
    enum class external_enum : unsigned short {
        a = 10,
        b,
        c = a + b
    };

    // should be in the same namespace
    ENUM_HPP_TRAITS_DECL(external_enum,
        (a)
        (b)
        (c))
}

ENUM_HPP_REGISTER_TRAITS(external_ns::external_enum)

int main()
{
    using ee = external_ns::external_enum;
    static_assert(enum_hpp::to_string(ee::a) == "a");
    static_assert(enum_hpp::from_string<ee>("c") == ee::c);
    return 0;
}
#22
7:20, 22 ноя. 2019

MATov
сам же понимаешь, что по ссылке выше выглядит гораздо волшебнее

#23
7:37, 22 ноя. 2019

Suslik
понимаю, но gcc 9 это борщ. Да и вообще смущают меня игры с __PRETTY_FUNCTION__ и __FUNCSIG__, сегодня работают, завтра перестанут.

#24
21:11, 22 ноя. 2019

Мне вот не столько не хватает перевода енума в строки, сколько возможности получить кол-во ключей в нем.

#25
21:16, 22 ноя. 2019

nes
Ну вон, enum.hpp даст тебе это)

#26
21:26, 22 ноя. 2019

MATov
Не, нафиг, пока делаю так, не айс конечно, но зато без макросов:

enum class SomeEnum : int32
{
  Key1,
  Key2,
  ...
  EnumCount_
};

const int32 MaxSomeEnumKeys = static_cast<int32>(SomeEnum::EnumCount_);
#27
21:37, 22 ноя. 2019

nes
Чего не так?

Зачем сабж вообще? Хитрая авто-сериализация, в которой баги бизнес-логики потом искать?

#28
21:43, 22 ноя. 2019

NyakNyakProduction
Уродливо - раз, дублирование константы - два.

#29
3:22, 23 ноя. 2019

MATov
> но gcc 9 это борщ.
nbkolchin
> Т.е. требуется gcc не ниже 9-й версии.
Новый gcc и соответственно msvc там нужен только для шаблонной магии вывода типов c++17, в c++11 можно так же писать enum_name<Enum, Enum::Val>();

Страницы: 1 2 3 Следующая »
ПрограммированиеФорумОбщее