C++ 枚举作为参数返回字符串

C++ 枚举作为参数返回字符串,c++,string,enums,C++,String,Enums,我当前的程序使用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

我当前的程序使用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){}

或者我必须为每个不同的枚举创建一个函数吗?可能是因为我读了一些书,有些编译器允许枚举解析为int,所以我可以将枚举作为int传递,然后使用它吗?

Enum
名称只有在编译之前才有意义。我不认为有一个便携式或标准定义的方式来以干净的方式完成这项工作

您可以按如下方式进行操作:

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

否,枚举没有隐式基类

您可以使用模板或函数重载。但是,是的,你必须用手来做

enum有一些技巧→字符串“conversion”已列出。

有两种“ToString-like”函数实现选项:

  • 实现简单的静态开关箱功能
  • 代码:

  • 通过字典查找实现静态函数
  • 代码:

    typedef std::map ThingsMap;
    静态ThingsMap GetThingsMap()
    {
    事物地图;
    插入(ThingsMap::value_type(Thing1,std::string(“Thing1”));
    事物映射插入(ThingsMap::value\u类型(Thing2,std::string(“Thing2”));
    插入(ThingsMap::value_type(Thing3,std::string(“Thing3”));
    插入(ThingsMap::value_类型(OtherThing,std::string(“OtherThing”));
    返回地图上的东西;
    }
    静态std::string ThingEnumToString(ThingEnum thing)
    {
    静态常量ThingsMap things(GetThingsMap());
    ThingsMap::const\u迭代器it=things.find(thing);
    if(it!=things.end()){
    返回->秒;
    }否则{
    抛出std::无效的_参数(“thing”);
    }
    }
    
    这是我提倡使用宏使代码更易于理解/维护(并至少消除一个错误源)的情况之一

    因此


    那么您要做的是将枚举值转换为字符串?也许您应该修改问题标题…
    ,因为枚举的值实际上只是一个始终有值的专用变量名
    whut@Lightness当编译器读取enum Ex{this,thisTo};它将为它们生成值(除非它们被设置为specifics),但是要访问它们,您需要使用表示该值的名称,就像使用解析操作符来获得类中的确切方法一样。正如有关枚举的文献所述,“枚举将解析为特定值(int地址),但即使已知该值,反向转换也无法解析”@gardian06:是的,我知道枚举是什么,谢谢。我想知道引用的段落到底是什么意思。@LightnessRacesinOrbit它意味着你可以使用枚举,就像在C中你可以使用#define CONST_THING=0x0A一样,每次你使用CONST_THING时,它都会解析为那个值。与每次使用thisTo时enum Ex{this,thisTo}总是解析为分配给它的值(假设范围)的方式相同,hens Ex是一个专用变量,thisTo是它的值。是的,更好的语句应该是“因为枚举实际上只是一个具有预设已知值的专用变量”,基本上如果我可以将枚举放入函数中,那么我基本上可以像大小写开关一样返回正确的字符串。我不一定想让它返回自己的名称,但至少要对它进行逻辑检查。@gardian06是的,就像在我的编辑中一样,但它不是泛型的(无论如何也没有意义),而且你必须硬编码很多东西。你为什么还需要这个?来生成日志消息。因为我必须在这些之上集成东西,“method returned:6”对于调试来说没有“method returned:Error2”那么有意义。相反,当枚举常量很多时,第二个是实际的。
    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;
        }
    }
    
    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");
        }
    }
    
      #define TOSTRING(name) case name: return #name
      switch (val)
      {
          TOSTRING(Thing1);
          TOSTRING(Thing2);
          default:
             //bad things happened.
       }