2017-04-20 142 views
3

的 - 背景信息:枚举类用C型串++

有一个在C++ 11已知为可以存储内部变量的枚举类的类。不过,我只看到了类的类型是char:

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

- 问:

有什么办法,我可以表达这种枚举类类型的字符串?

例如,

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

- 我想什么:

我尝试使用它,但我得到的错误,我不知道如果我这样做是正确与否。我想使用字符串的原因是它们能够同时容纳多个字符,所以它使它们对我的代码更有用。

+0

好吧,这意味着我们只能将枚举类表示为char,而不是int,字符串或任何其他类型。 – Kourosh

+1

@CinCout评论中的所有内容都不正确。只有在没有指定类型的情况下,作用域枚举的基础类型才是“int”,在上例中不是这种情况。而'char'肯定不是'int'。 – Praetorian

+1

@Kourosh *在C++ 11中有一个类称为枚举类* ...否,没有这样的类,'enum class'用于定义范围枚举。下面的答案链接到解释这些内容的文档。 – Praetorian

回答

4

在C++ 11或C++ 14中没有办法做到这一点。但是,您应该考虑使用enum class,然后对一些显式函数或运算符进行编码,以将其转换为std::string -s。

在C++ 11中有一个称为枚举类的类,您可以在其中存储变量。

那措辞是不正确的:枚举类不存储变量(但枚举)。

所以,你可能代码:

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

(这是可能的,因为answered by druckermanly,因为char整体式;当然你也可以不使用字符串代替)

再定义一些MyEnum string_to_MyEnum(const std::string&);功能(如果参数是一个意外的字符串,它可能会引发一些异常),另一个是std::string MyEnum_to_string(MyEnum);。你甚至可以考虑也有一些cast operator叫他们(但我不觉得可读,在你的情况)。您还可以定义一个class MyEnumValue,其中包含一个MyEnum类型的单个数据成员,并且该类别具有cast operator,例如,

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(见rule of five),你可能几乎总是使用MyEnumValue代替MyEnum(这或许甚至可能是内部class MyEnumValue

+0

好吧,我看到了,也许最好说hold变量? – Kourosh

+0

不,最好使用*枚举器*的标准术语。 –

+0

行得通的。谢谢:) – Kourosh

0

编译器在内部将您的char转换为其等效的int表示形式(ASCII)。所以它不可能用字符串代替。