Enums与其对应的Arrays之间是否可以紧密绑定
请注意,这些只是伪代码才能获得理解。
方法1.一种方法是创建声明并定义数组。
enum Names
{
ABC,
DEF,
GHI
};
char* names[] = {"abc", "def", "ghl"}; // Declare and define.
获得我们将要做的价值
char *nm = names[ABC];
这种方法的缺点是我们需要保持enum和names数组同步,即如果我们改变枚举,我们移动某些值,那些也需要在表中完成
对于Ex:将DEF移动到枚举顶部
enun名称 { DEF, ABC, GHI };
//也改变数组。
char * names [] = {“def”,“abc”,“ghi”}
方法2。
打破枚举和数组之间绑定的一种方法是使用如下的创建函数。
int CreateNamesArray() {
Names[GHI] = "ghl";
Names[DEF] = "def";
Names[GHI] = "ghi";
};
现在即使枚举经历了更改,阵列也不会受到影响。 这种方法的一个缺点是我们需要在访问表之前调用该函数。
请建议哪种方法更好。这些表格约为30-100个条目。
答案 0 :(得分:4)
您可以使用宏来生成它们:
#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
更改LIST
内的对以设置键/值对。
答案 1 :(得分:1)
不使用宏:
#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;
}
答案 2 :(得分:0)
我建议Boost.Preprocessor来实现这一目标:
#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"))
);