Возможно ли преобразовать значения перечислений в C ++ 11 без макросов? - PullRequest
8 голосов
/ 18 ноября 2011

Я знаю, что можно написать макрос "register", который отобразит их значения в их строковые представления. Однако есть ли какое-то новое волшебство в C ++ 11, позволяющее обойтись без макросов и шаблонов регистрации?

Чтобы было понятно, я хотел бы иметь возможность печатать идентификаторы переменных перечисления, такие как:

enum Days { Sunday, Monday, Tuesday };
auto d = Days::Sunday;
std::cout << magic << d;

Должен вывести

Days::Sunday

Ответы [ 3 ]

8 голосов
/ 18 ноября 2011

Нет, это не совсем возможно.Вам нужны макросы (желательно) или для расширения компилятора для дополнительных приемов (вы можете расширить GCC с помощью плагинов или с помощью MELT для обеспечения специальной функции _my_enum_name_builtin, но я не думаю, что это хорошая идея).Вы также можете (при условии, что исполняемый файл построен с сохранением отладочной информации) извлечь имя из отладочной информации.

Если вам действительно это нужно, возможно, более простой способ - это сгенерировать некоторый (C ++) код, который почтиМакросы делают для вас. Qt Moc может стать для вас источником вдохновения.

2 голосов
/ 18 ноября 2011

Нет. Без макросов невозможно.

0 голосов
/ 04 июля 2018

Как уже сказано не возможно.Но вы можете рассмотреть возможность использования класса в качестве enum.

class Day
{
   enum _Day{ Sunday, Monday, Tuesday, Wensday, Thursday, Friday, Saturday }

public:
    static Day Sun;
    static Day Mon;
    static Day Tue;
    static Day Wen;
    static Day Thu;
    static Day Fri;
    static Day Sat;

    operator    int() const     { return _day; }

    int         toInt() const   { return _day; }
    std::string toStr() const   { return _name;}

private:
    Day(_Day day, std::string name) 
        : _day(day), _name(std::move(name))
    {
    }

  _Day _day;
  std::string _name;
};

Day Day::Mon = Day(_Day::Sun, "Sunday");
Day Day::Mon = Day(_Day::Mon, "Monday");

// ....

Более строгая типизация, работает точно так же, как enum, с необходимыми дополнительными функциями.

Более того, вы можете добавить все удобные функциональные возможности, которые выможет желать, например:

operator std::string() const;
bool operator==(const Day&);
Day& operator=(const Day&);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...