Enums to Array绑定

时间:2013-01-11 04:00:52

标签: c++ coding-style

  

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个条目。

3 个答案:

答案 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"))
);