Перечислимый класс типа string в C++

- Исходная информация:

В C++11 есть класс, называемый enum class, в котором вы можете хранить переменные. Однако я видел только тип класса char:

enum class : char {
   v1 = 'x', v2 = 'y'
};

- вопрос:

Есть ли способ, которым я могу выразить этот enum-класс типа string?

Например,

enum class : string{
  v1 = "x", v2 = "y"
};

- Что я думаю:

Я пытался использовать его, но я получил ошибки, я не уверен, правильно ли я это делаю или нет. Причина, по которой я хочу использовать строки, заключается в том, что они могут содержать несколько символов одновременно, что делает их более полезными для моего кода.

3 ответа

Решение

Нет способа сделать это в C++11 или C++14. Однако вам следует рассмотреть возможность использования некоторого класса enum, а затем кодировать некоторые явные функции или операторы для его преобразования в и std::string-s.

В C++11 есть класс, называемый enum class, в котором вы можете хранить переменные.

Это выражение не является правильным: класс enum не хранит переменные (но перечислители).

Так что вы можете написать:

enum class MyEnum : char {
   v1 = 'x', v2 = 'y'
};

(это возможно, как ответил druckermanly, потому что char является целочисленным типом; конечно вы не можете использовать строки вместо)

затем определить некоторые MyEnum string_to_MyEnum(const std::string&); функция (вероятно, она выдаст какое-то исключение, если аргумент является неожиданной строкой) и другой std::string MyEnum_to_string(MyEnum); один. Вы можете даже подумать о том, чтобы какой-то оператор приведения вызывал их (но я не нахожу это читабельным в вашем случае). Вы также можете определить class MyEnumValue содержащий один единственный элемент данных MyEnum тип и иметь этот класс, имеющий оператор приведения, например

 class MyEnumValue {
    const MyEnum en;
 public:
    MyEnumValue(MyEnum e) : en(e) {};
    MyEnumValue(const std::string&s)
     : MyEnumValue(string_to_MyEnum(s)) {};
    operator std::string () const { return MyEnum_to_string(en);};
    operator MyEnum () const { return en };
    //// etc....
 };

С соответствующими больше вещей в MyEnumValue (см. правило пяти), вы можете почти всегда использовать MyEnumValue вместо MyEnum (что, возможно, даже может быть внутренним class MyEnumValue)

Нет, это невозможно.

http://en.cppreference.com/w/cpp/language/enum заявляет:

Значения констант являются значениями целочисленного типа, известного как базовый тип перечисления.

Ключевым моментом является "целочисленный тип" - строка не является целочисленным типом.

Компилятор внутренне преобразует ваш символ в его эквивалентное представление int (ASCII). Поэтому было бы невозможно использовать строку вместо.

Другие вопросы по тегам