首页
学习
活动
专区
圈层
工具
发布

C++11中的
EN

Stack Overflow用户
提问于 2014-01-30 12:14:37
回答 6查看 34.9K关注 0票数 31

我不止一次地意识到这个has been asked before,但是我找不到一个问题,用C++11显式地寻找这个问题的解决方案,所以我们再来一次。

我们能方便地用C++11?得到枚举的字符串值吗?

也就是说,在C++11中是否有(现在)任何内置功能允许我们获得枚举类型的字符串表示形式,如

代码语言:javascript
复制
typedef enum {Linux, Apple, Windows} OS_type; 
OS_type myOS = Linux;

cout << myOS

在控制台上打印Linux

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2014-01-30 14:08:28

C++ (和C)中长期和不必要的缺乏泛型枚举到字符串的特性是一个痛苦的问题。C++11没有解决这个问题,据我所知,C++14也不会。

就我个人而言,我会使用代码生成来解决这个问题。C预处理器是一种方式--你可以在这里的注释中看到一些其他的答案。但实际上,我更喜欢专门为枚举编写自己的代码生成。然后,它可以根据需要轻松地生成to_string (char*)from_stringostream operator<<istream operator<<is_valid和更多方法。这种方法可以非常灵活和强大,但它在项目中的多个枚举之间强制执行绝对的一致性,并且不需要运行时成本。

使用Python的优秀"mako“包,或者在Lua中使用轻量级,如果反对依赖关系,则使用CPP,或者使用CMake自己的代码生成工具。有很多种方法,但都归结为同一件事:您需要自己生成代码--C++不会为您(不幸地)做到这一点。

票数 18
EN

Stack Overflow用户

发布于 2015-11-09 00:28:49

在我看来,最可维护的方法是编写一个助手函数:

代码语言:javascript
复制
const char* get_name(OS_type os) {
  switch (os) {
  case Linux: return "Linux";
  case Apple: return "Apple";
  case Windows: return "Windows";
  }
}

最好不要实现“默认”情况,因为这样做会确保如果忘记实现用例(具有正确的编译器和编译器设置),则会收到编译器警告。

票数 8
EN

Stack Overflow用户

发布于 2015-06-12 22:49:49

我喜欢使用C预处理器进行黑客攻击,这是我第一次看到的:http://blogs.msdn.com/b/vcblog/archive/2008/04/30/enums-macros-unicode-and-token-pasting.aspx

它使用标记粘贴操作符#。

代码语言:javascript
复制
// 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博客链接(见上文)上,一个用户用一个使整个事情变得更漂亮的技巧做了一个评论,并且避免了#包括:

代码语言:javascript
复制
#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的答案也使用了标记粘贴操作符)

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21456262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档