2012-02-02 41 views
3

我现在的程序使用3个不同的枚举:枚举作为参数,返回字符串

enum ThingEnum{ 
    Thing1 = 0, 
    Thing2 = 1, 
    Thing3 = 2, 
    OtherThing = 3 
}; 
enum ReturnEnum { 
    Success = 4,// the method did what it is supposed to 
    Error1 = 5,// an error occured 
    Error2 = 6,// an error occured 
    Error3 = 7,// an error occured 
    Error4 = 8,// a fatal error occured program must terminate 
    Pointer = 9// the method may need to be called again 
}; 
enum TypeEnum { 
    Type1 = 10, 
    Type2 = 11, 
    Type3 = 12, 
    Type4 = 13, 
    OtherType = 14 
}; 

我想要做的就是创建一个全局函数,它接受一个枚举并返回一个字符串(如枚举的值是真的只是一个总是有值的专用变量名称)。 是否可以创建一个采用泛型枚举的函数?例如

string enumToString (enum _enum){} 

还是我必须为每个不同的枚举做一个函数?只是一个可能的想法,我做了一些阅读,并且一些编译器允许Enum解析为int,所以我可以将enum作为int来传递,然后使用它?

+0

所以,你想要做的是一个枚举值转换为字符串?也许你应该修改问题标题...... – tenfour 2012-02-02 11:41:57

+0

'因为enum的值实际上只是一个总是具有值的专用变量名'whut – 2012-02-02 11:52:02

+0

@Lightness当编译器读取枚举Ex {this,thisTo};它会为它们生成值(除非它们被设置为具体值),但要访问它们,您需要使用表示该值的名称,就像使用解析运算符来获取类中的精确方法。因为有关枚举的文献将陈述“一个枚举将解析为一个特定的值(一个int地址),但即使该值已知反向转换也不会解决” – gardian06 2012-02-02 12:18:33

回答

2

有 “的ToString样” 函数实现的两个选项:

  1. 实现一个简单的静态的switch-case功能。

代码:

std::string ThingEnumToString(ThingEnum thing) 
{ 
    switch (thing) { 
    case Thing1: 
     return std::string("Thing1"); 
    case Thing2:  
     return std::string("Thing2"); 
    case Thing3: 
     return std::string("Thing3");   
    case OtherThing: 
     return std::string("OtherThing"); 
    default: 
     throw std::invalid_argument("thing"); 
     break; 
    } 
} 
  1. 实现与词典查找一个静态函数。

代码:

typedef std::map<ThingEnum, std::string> ThingsMap; 

static ThingsMap GetThingsMap() 
{ 
    ThingsMap things_map; 
    things_map.insert(ThingsMap::value_type(Thing1, std::string("Thing1"))); 
    things_map.insert(ThingsMap::value_type(Thing2, std::string("Thing2"))); 
    things_map.insert(ThingsMap::value_type(Thing3, std::string("Thing3"))); 
    things_map.insert(ThingsMap::value_type(OtherThing, std::string("OtherThing"))); 
    return things_map; 
} 

static std::string ThingEnumToString(ThingEnum thing) 
{ 
    static const ThingsMap things(GetThingsMap()); 
    ThingsMap::const_iterator it = things.find(thing); 
    if (it != things.end()) { 
     return it->second; 
    } else { 
     throw std::invalid_argument("thing"); 
    } 
} 
+1

我喜欢选项1.它看起来更干净,更清晰。 – gardian06 2012-02-02 12:26:13

+0

就个人而言,我选择第一个枚举常量时。相反,当存在大量枚举常量时,第二个是实际的。 – 2012-02-02 12:32:34

0

enum名称只有在编译前才有意义。我认为没有一种便捷或标准定义的方式来以干净的方式来做到这一点。

如下你可以这样做:

std::string getName(ThingEnum x) 
{ 
    switch (x) 
    { 
    case Thing1: 
     return "Thing1"; 
    case Thing2: 
     return "Thing2"; 
    //.... 
    } 
} 
+0

基本上,如果我可以得到枚举进入函数,那么我基本上可以像case切换一样返回正确的字符串。我不一定要让它返回自己的名字,但至少要对它进行逻辑检查。 – gardian06 2012-02-02 11:50:43

+0

@ gardian06是的,就像在我的编辑中一样,但它不是通用的(无论如何都没有意义),而且你必须硬编码很多东西。无论如何,你为什么还需要这个? – 2012-02-02 11:54:23

+0

生成日志消息。因为我必须在这些之上集成东西,并且“返回的方法:6”与调用的“方法返回:Error2”没有多大意义。 – gardian06 2012-02-02 12:05:01

1

不,枚举没有隐含的基类。

您可以使用模板或函数重载。但是,是的,你将不得不亲手做。

enum →字符串“转换”列出here有一些技巧。

2

这是在那里我主张用宏来使你的代码更容易理解/维护(并删除错误的至少一个源)的情况下

一个

因此

#define TOSTRING(name) case name: return #name 
    switch (val) 
    { 
     TOSTRING(Thing1); 
     TOSTRING(Thing2); 
     default: 
     //bad things happened. 
    }