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

C++, enum reflection (enum.hpp)

Страницы: 1 2 3 Следующая »
#0
(Правка: 7:40) 7:39, 21 ноя. 2019

Надоело каждый раз придумывать как же парсить и преобразовывать енумы в строчки. Решил наконец закрыть для себя этот вопрос написав мини-либу. Встречайте.

enum.hpp

Примерчики:

ENUM_HPP_CLASS_DECL(mask, unsigned char,
    (none)
    (color = 1 << 0)
    (alpha = 1 << 1)
    (all = color | alpha))

mask_traits::to_string(mask::color); // "color"

mask_traits::from_string("alpha"); // mask::alpha

mask_traits::size; // 4

for ( auto n : mask_traits::names ) {
    std::cout << n << "\n";
}

// none
// color
// alpha
// all

Альтернативы, сотни их

Да, но среди самых популярных нашлись фатальные недостатки (как всегда). Основной это построение оных на вариадик макросах, которые ограничены в MSVC волшебным числом 127, что не даст задать банальный список клавиш, которых чуть больше. Второй недостаток, что они пытаются городить улучшенную версию этих самых енумов на своих классах (better-enums и иже с ним), я не хочу отказываться от стандартной семантики и работы с енумами. Как бы то ни было... будет ещё одна :)

P.S. Звёзды на гитхабе, пулл-реквесты, советы и отзывы очень приветствуются!

#1
8:04, 21 ноя. 2019

Костыль и не нужон.
Свича хватит всем.

#2
9:09, 21 ноя. 2019

C++ ненужон

#3
(Правка: 9:28) 9:26, 21 ноя. 2019

MATov
скобки гейские и макрос для объявления.

> которые ограничены в MSVC волшебным числом 127
лол, а у тебя 256, причём 50% кода — это копирование говнокода, ограниченного этим числом.

однако, у меня нет предложений, как то же самое сделать во всех отношениях лучше. я делаю через рантайм регистрацию так:

  enum class Days
  {
    Monday, Tuesday,...
  };
  EnumSerializer<Days> days_serializer;
  days_serializer.Register(Days::Monday, "Monday");
конечно, этот вариант не лишён недостатков, хотя бы потому что добавлять каждый новый мембер нужно в двух местах, но, я считаю, это лучше, чем вагон говномакросов инклудить.

#4
9:44, 21 ноя. 2019

Генерацию кода в пребилде еще никто не запрещал.

#5
9:46, 21 ноя. 2019

Suslik

> скобки гейские

Да пофик, не гомофоб.

> лол, а у тебя 256, причём 50% кода — это копирование говнокода, ограниченного
> этим числом.

Вот только я могу сделать больше, а на вариадиках - хер. На самом деле, я сначала на вариадиках сделал, потом на это ограничение наткнулся и переделывал с болью вот на сиквенции эти boost.preprocessor стаил. На тему макросной копипасты: ну такое ага, с вариадиками такое же количество её, кстати, только другой)

> я делаю через рантайм регистрацию так:

Так вот и надоело делать так, хочу один раз и ждать кресто-рефлекшен/кресто-метаклассы. Да и просто побаловаться охото было в конце-то концов :)

С таким подходом непонятно как сделать доступ к traits'ам в шаблонном контексте, ибо енумы в неймспейсах, а из них я не могу специализировать что-то во вне (пропозалы есть, но чё-то пока там не шевелятся в этом плане, на сколько я знаю). А делать доп.строчку которую надо будет пихать снаружи неймспейса для каждого макроса криво как-то, кек(

#6
12:11, 21 ноя. 2019

Всю жизнь юзал X MACRO https://en.wikipedia.org/wiki/X_Macro
Но гейские макросы, да

#7
12:27, 21 ноя. 2019

Хм, а может в гействе что-то есть..

#8
12:37, 21 ноя. 2019

jaguard
Попробуй, потом расскажешь нам про ощущения.

#9
16:20, 21 ноя. 2019

https://github.com/Neargye/magic_enum

#include <iostream>
#include <magic_enum.hpp>

enum class test : int
{
    A = 1 << 0,
    B = 1 << 1,
    C = 1 << 2
};

int main()
{
    test t = test::C;
    std::cout << magic_enum::enum_name(t) << '\n';
    std::cout << magic_enum::enum_name(test::A) << '\n';
}
#10
17:24, 21 ноя. 2019

nbkolchin
Как работает это чудо?

#11
17:51, 21 ноя. 2019

Vlad2001_MFS
> Как работает это чудо?
Немного шаблонной магии + парсинг макроса __PRETTY_FUNCTION__

#12
18:11, 21 ноя. 2019

Вот вроде С++ хороший язык, но некоторые моменты - это ппц. Интересно, почему никак не родят  __class__  который был бы частью стандарта.

#13
18:22, 21 ноя. 2019

BingoBongo
Да потому что в него уже напихали столько говна,
что распарсить это чудовище - отдельная наука,
так что добавить новую фичу занимает годы времени.

#14
18:23, 21 ноя. 2019

BingoBongo
> Вот вроде С++ хороший язык
в каком месте?

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