Надоело каждый раз придумывать как же парсить и преобразовывать енумы в строчки. Решил наконец закрыть для себя этот вопрос написав мини-либу. Встречайте.
Примерчики:
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. Звёзды на гитхабе, пулл-реквесты, советы и отзывы очень приветствуются!
Костыль и не нужон.
Свича хватит всем.
C++ ненужон
MATov
скобки гейские и макрос для объявления.
> которые ограничены в MSVC волшебным числом 127
лол, а у тебя 256, причём 50% кода — это копирование говнокода, ограниченного этим числом.
однако, у меня нет предложений, как то же самое сделать во всех отношениях лучше. я делаю через рантайм регистрацию так:
enum class Days { Monday, Tuesday,... }; EnumSerializer<Days> days_serializer; days_serializer.Register(Days::Monday, "Monday");
Генерацию кода в пребилде еще никто не запрещал.
Suslik
> скобки гейские
Да пофик, не гомофоб.
> лол, а у тебя 256, причём 50% кода — это копирование говнокода, ограниченного
> этим числом.
Вот только я могу сделать больше, а на вариадиках - хер. На самом деле, я сначала на вариадиках сделал, потом на это ограничение наткнулся и переделывал с болью вот на сиквенции эти boost.preprocessor стаил. На тему макросной копипасты: ну такое ага, с вариадиками такое же количество её, кстати, только другой)
> я делаю через рантайм регистрацию так:
Так вот и надоело делать так, хочу один раз и ждать кресто-рефлекшен/кресто-метаклассы. Да и просто побаловаться охото было в конце-то концов :)
С таким подходом непонятно как сделать доступ к traits'ам в шаблонном контексте, ибо енумы в неймспейсах, а из них я не могу специализировать что-то во вне (пропозалы есть, но чё-то пока там не шевелятся в этом плане, на сколько я знаю). А делать доп.строчку которую надо будет пихать снаружи неймспейса для каждого макроса криво как-то, кек(
Всю жизнь юзал X MACRO https://en.wikipedia.org/wiki/X_Macro
Но гейские макросы, да
Хм, а может в гействе что-то есть..
jaguard
Попробуй, потом расскажешь нам про ощущения.
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'; }
nbkolchin
Как работает это чудо?
Vlad2001_MFS
> Как работает это чудо?
Немного шаблонной магии + парсинг макроса __PRETTY_FUNCTION__
Вот вроде С++ хороший язык, но некоторые моменты - это ппц. Интересно, почему никак не родят __class__ который был бы частью стандарта.
BingoBongo
Да потому что в него уже напихали столько говна,
что распарсить это чудовище - отдельная наука,
так что добавить новую фичу занимает годы времени.
BingoBongo
> Вот вроде С++ хороший язык
в каком месте?