Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 变量枚举';类别';在c++;_C++_C++11_Enums - Fatal编程技术网

C++ 变量枚举';类别';在c++;

C++ 变量枚举';类别';在c++;,c++,c++11,enums,C++,C++11,Enums,我经常在以下代码中使用类似的内容: // myclass.h class MyClass { public: enum MyEnum { E1, E2, NUMMYENUM }; const char* kMyEnum[NUMMYENUM] = {"e1", "e2"}; const char* MyEnum2Char(MyEnum me) { return kMyEnum[me]; } enum MySEnum { SE1, SE2

我经常在以下代码中使用类似的内容:

// myclass.h

class MyClass {
 public:
  enum MyEnum { E1, E2, NUMMYENUM };
  const char* kMyEnum[NUMMYENUM] = {"e1", "e2"};
  const char* MyEnum2Char(MyEnum me) { return kMyEnum[me]; }

  enum MySEnum { SE1, SE2, NUMMYSENUM };
  static const char* kMySEnum[NUMMYSENUM];
  static const char* MySEnum2Char(MySEnum se) { return kMySEnum[se]; }

  void foo(MyEnum me) {
    //do something, e.g. print
    std::cout << MyEnum2Char(me) << "maps to " << emap[me] << "\n";
  }

  void bar(MySEnum se) {
    //do something, e.g. print
    std::cout << MySEnum2Char(se) << "maps to " << semap[se] << "\n";
  }

 private:
  std::map<MyEnum, int> emap;
  std::map<MySEnum, int> semap;
 };


// myclass.cc

#include "myclass.h"

const char* MyClass::kMySEnum[MyClass::MySEnum::NUMMYSENUM] = {"se1", "se2"};

有没有一种方法可以实现像这样的“无杂乱”的东西?也许使用宏?

< p>可以在C++ 11中使用一种称为XGrand的技术,以及C++和C的旧版本,以方便地定义用于将枚举转换为字符串的一致查找表。 首先,编写一个外部文件(我们称之为my_class.xmacro),其中包括以下内容:

#define SE_ENUM_TABLE  \
    ENTRY(SE1) \
    ENTRY(SE2) 
#include "my_class.xmacro"

    
enum SeEnum{
#define ENTRY(a) a,
       SE_ENUM_TABLE
#undef ENTRY
    };

const std::string seEnumString[] = {
#define str_macro(a) #a
#define ENTRY(a) str_macro(a),
    SE_ENUM_TABLE
#undef ENTRY
};
接下来,在H文件中包括my_class.xmacro,以定义以下内容:

#define SE_ENUM_TABLE  \
    ENTRY(SE1) \
    ENTRY(SE2) 
#include "my_class.xmacro"

    
enum SeEnum{
#define ENTRY(a) a,
       SE_ENUM_TABLE
#undef ENTRY
    };

const std::string seEnumString[] = {
#define str_macro(a) #a
#define ENTRY(a) str_macro(a),
    SE_ENUM_TABLE
#undef ENTRY
};
seEnumStringId中的宏获取条目(a)并将其转换为“a”。因此,在预处理器处理完此文件后,它实际上会按照如下方式查看编译器:

enum SeEnum{
    SE1,
    SE2 
};
    
const std::string seEnumString[] = {
    "SE1",
    "SE2" 
    };

使用此技术,您可以确保添加枚举将以正确的顺序自动创建字符串id,并且此技术还可以用于生成其他类型的查找表。

这是否回答了您的问题?我想有点。缺点是它需要c++17,而我使用的是c++11,另外我想指定(可能有不同的命名)附加到每个枚举的字符/字符串(
E1
“E1”
),而
magic_enum
似乎两者的命名相同(
E1
“E1”
)。有时使用的一个技巧是使用头文件定义枚举值,类似这样:
enum_值(SE1,“SE1”)
(更像这样)。文件本身没有定义
枚举值
。然后,您#包含两次此头-一次定义
ENUM_值
,以发出枚举值,然后再次定义它以发出字符串文本。因此,你可以在相同的源代码下生成<代码> MyEnum < /C>和<代码> KMyEnUM/Cuth.另一个技巧是用自己选择的脚本语言定义数据,并编写脚本自动生成C++代码。