Перечислимый класс типа 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). Поэтому было бы невозможно использовать строку вместо.