3

枚举之间可以紧密绑定到它们对应的数组吗

请注意,这些只是伪代码,只是为了理解。

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

enum Names
{
    ABC,
    DEF,
    GHI
};

char* names[] = {"abc", "def", "ghl"};      // Declare and define.

为了获得我们将做的价值

char *nm = names[ABC];

这种方法的缺点是我们需要保持枚举和名称数组同步,即如果我们更改枚举,我们会移动某些值,这些值也需要在表中完成

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

enun 名称 { DEF, ABC, GHI };

// 也改变数组。

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

方法2。

打破枚举和数组之间绑定的一种方法是使用如下所示的创建函数。

诠释 CreateNamesArray() {

      Names[GHI] = "ghl";

      Names[DEF] = "def";

      Names[GHI] = "ghi";

};

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

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

4

3 回答 3

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以设置键/值对。

于 2013-01-11T04:09:22.860 回答
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;
}
于 2013-01-11T04:16:19.240 回答
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"))
);
于 2013-01-11T04:19:33.547 回答