我不止一次地意识到这个has been asked before,但是我找不到一个问题,用C++11显式地寻找这个问题的解决方案,所以我们再来一次。
我们能方便地用C++11?得到枚举的字符串值吗?
也就是说,在C++11中是否有(现在)任何内置功能允许我们获得枚举类型的字符串表示形式,如
typedef enum {Linux, Apple, Windows} OS_type;
OS_type myOS = Linux;
cout << myOS在控制台上打印Linux?
发布于 2014-01-30 14:08:28
C++ (和C)中长期和不必要的缺乏泛型枚举到字符串的特性是一个痛苦的问题。C++11没有解决这个问题,据我所知,C++14也不会。
就我个人而言,我会使用代码生成来解决这个问题。C预处理器是一种方式--你可以在这里的注释中看到一些其他的答案。但实际上,我更喜欢专门为枚举编写自己的代码生成。然后,它可以根据需要轻松地生成to_string (char*)、from_string、ostream operator<<、istream operator<<、is_valid和更多方法。这种方法可以非常灵活和强大,但它在项目中的多个枚举之间强制执行绝对的一致性,并且不需要运行时成本。
使用Python的优秀"mako“包,或者在Lua中使用轻量级,如果反对依赖关系,则使用CPP,或者使用CMake自己的代码生成工具。有很多种方法,但都归结为同一件事:您需要自己生成代码--C++不会为您(不幸地)做到这一点。
发布于 2015-11-09 00:28:49
在我看来,最可维护的方法是编写一个助手函数:
const char* get_name(OS_type os) {
switch (os) {
case Linux: return "Linux";
case Apple: return "Apple";
case Windows: return "Windows";
}
}最好不要实现“默认”情况,因为这样做会确保如果忘记实现用例(具有正确的编译器和编译器设置),则会收到编译器警告。
发布于 2015-06-12 22:49:49
我喜欢使用C预处理器进行黑客攻击,这是我第一次看到的:http://blogs.msdn.com/b/vcblog/archive/2008/04/30/enums-macros-unicode-and-token-pasting.aspx。
它使用标记粘贴操作符#。
// This code defines the enumerated values:
#define MY_ENUM(x) x,
enum Fruit_Type {
MY_ENUM(Banana)
MY_ENUM(Apple)
MY_ENUM(Orange)
};
#undef MY_ENUM
// and this code defines an array of string literals for them:
#define MY_ENUM(x) #x,
const char* const fruit_name[] = {
MY_ENUM(Banana)
MY_ENUM(Apple)
MY_ENUM(Orange)
};
#undef MY_ENUM
// Finally, here is some client code:
std::cout << fruit_name[Banana] << " is enum #" << Banana << "\n";
// In practice, those three "MY_ENUM" macro calls will be inside an #include file.坦白说这很难看。但是,最后在包含文件中输入枚举一次,这是更易于维护的。
顺便说一句,在MSDN博客链接(见上文)上,一个用户用一个使整个事情变得更漂亮的技巧做了一个评论,并且避免了#包括:
#define Fruits(FOO) \
FOO(Apple) \
FOO(Banana) \
FOO(Orange)
#define DO_DESCRIPTION(e) #e,
#define DO_ENUM(e) e,
char* FruitDescription[] = {
Fruits(DO_DESCRIPTION)
};
enum Fruit_Type {
Fruits(DO_ENUM)
};
// Client code:
std::cout << FruitDescription[Banana] << " is enum #" << Banana << "\n";(我刚刚注意到0x17de的答案也使用了标记粘贴操作符)
https://stackoverflow.com/questions/21456262
复制相似问题