枚举到数组绑定

Enums to Array bindings

本文关键字:绑定 数组 枚举      更新时间:2023-10-16

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

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

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

enum Names
{
    ABC,
    DEF,
    GHI
};
char* names[] = {"abc", "def", "ghl"};      // Declare and define.

为了获得价值,我们将进行

char *nm = names[ABC];

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

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

enun名称{DEF,ABC,GHI};

//也可以更改数组。

char*names[]={"def","abc","ghi"}

方法2.

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

int CreateNamesArray(({

      Names[GHI] = "ghl";
      Names[DEF] = "def";
      Names[GHI] = "ghi";

};

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

请建议哪种方法更好。这些表格大约有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

更改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;
}

我推荐Boost。实现这一点的预处理器:

#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"))
);