C++ 枚举到数组绑定

C++ 枚举到数组绑定,c++,coding-style,C++,Coding Style,枚举与其对应的数组之间可以进行紧密绑定吗 请注意,这些只是为了理解而编写的伪代码 方法1。一种方法是创建声明并定义数组。 enum Names { ABC, DEF, GHI }; char* names[] = {"abc", "def", "ghl"}; // Declare and define. 为了得到我们将要做的价值 char *nm = names[ABC]; 这种方法的缺点是,我们需要保持枚举和名称数组的同步,即如果我们更改枚举,我们将移动

枚举与其对应的数组之间可以进行紧密绑定吗

请注意,这些只是为了理解而编写的伪代码

方法1。一种方法是创建声明并定义数组。

enum Names
{
    ABC,
    DEF,
    GHI
};

char* names[] = {"abc", "def", "ghl"};      // Declare and define.
为了得到我们将要做的价值

char *nm = names[ABC];
这种方法的缺点是,我们需要保持枚举和名称数组的同步,即如果我们更改枚举,我们将移动表中需要执行的某些值

例如:将DEF移动到枚举的顶部

埃努恩名字 { DEF, 美国广播公司, GHI };

//同时更改数组

字符*名称[]={“def”、“abc”、“ghi”}

方法2.

enum Names
{
    ABC,
    DEF,
    GHI
};

char* names[] = {"abc", "def", "ghl"};      // Declare and define.
打破枚举和数组之间绑定的一种方法是使用如下所示的create函数

int CreateNamesArray() {

})

现在,即使枚举发生更改,阵列也不会受到影响。 这种方法的一个缺点是我们需要在访问表之前调用函数


请建议哪种方法更好。这些表格大约有30-100个条目

您可以使用宏生成它们:

#define LIST \
    PAIR(ABC, "abc") \
    PAIR(DEF, "def") \
    PAIR(GHI, "ghi")

#define PAIR(key, value) key,
enum Names { LIST };
#undef PAIR

#define PAIR(key, value) value,
char* names[] = { LIST };
#undef PAIR

#undef LIST
更改
列表中的对以设置键/值对。

不使用宏:

#include <iostream>

enum Names { ABC, DEF, GHI };
template< Names n > struct Name { static const char *val; };
template<> const char *Name<ABC>::val = {"abc"};
template<> const char *Name<DEF>::val = {"def"};
template<> const char *Name<GHI>::val = {"ghi"};

int main() {
  std::cout << Name<ABC>::val << std::endl;
  std::cout << Name<DEF>::val << std::endl;
  std::cout << Name<GHI>::val << std::endl;
  return 0;
}
#包括
枚举名称{ABC,DEF,GHI};
模板结构名{static const char*val;};
模板常量char*Name::val={“abc”};
模板常量char*Name::val={“def”};
模板常量char*Name::val={“ghi”};
int main(){
std::cout我建议实现以下目标:

#include <boost/preprocessor.hpp>
#define DECLARE_PAIRS_ENUM_ELEMENT(r, d, e) BOOST_PP_TUPLE_ELEM(2, 0, e),
#define DECLARE_PAIRS_STRING_ELEMENT(r, d, e) BOOST_PP_TUPLE_ELEM(2, 1, e),
#define DECLARE_PAIRS(n, s) \
    enum n##Names { BOOST_PP_SEQ_FOR_EACH(DECLARE_PAIRS_ENUM_ELEMENT, _, s) }; \
    std::string n##Strings[] = \
    { BOOST_PP_SEQ_FOR_EACH(DECLARE_PAIRS_STRING_ELEMENT, _, s) };
DECLARE_PAIRS(
    someList,
    ((DEF, "ABC"))
    ((ABC, "DEF"))
    ((GHI, "GHI"))
);
#包括
#定义DECLARE_PAIRS_ENUM_ELEMENT(r,d,e)BOOST_PP_TUPLE_ELEM(2,0,e),
#定义DECLARE_PAIRS_STRING_ELEMENT(r,d,e)BOOST_PP_TUPLE_ELEM(2,1,e),
#定义声明对(n,s)\
枚举n##名称{BOOST_PP_SEQ_FOR_EACH(声明_PAIRS_enum_元素,u,s)}\
std::string n##Strings[]=\
{BOOST_PP_SEQ_FOR_EACH(声明_PAIRS_STRING_元素,u,s)};
声明\u对(
一些人,
((定义为“ABC”))
((ABC,“DEF”))
((GHI,“GHI”))
);

最好的方法是不使用全局数组:)或该材质的任何全局变量当您说“全局”数组时,是指具有全局可用别名/数组索引名称的数组吗?