3

列挙型と対応する配列との間をタイトにバインドしても問題ありませんか

これらは理解を深めるための単なる擬似コードであることに注意してください。

方法 1. 1 つの方法は、宣言を作成して配列を定義することです。

enum Names
{
    ABC,
    DEF,
    GHI
};

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

値を取得するには

char *nm = names[ABC];

この方法には、列挙型と名前配列を同期させておく必要があるという欠点があります。つまり、列挙型を変更して特定の値を移動する場合、それらはテーブルでも行う必要があります。

例: DEF を列挙型の先頭に移動します。

enun Names { DEF、ABC、GHI };

// 配列も変更します。

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

方法 2。

列挙型と配列の間のバインドを解除する 1 つの方法は、以下のような create 関数を使用することです。

int CreateNamesArray() {

      Names[GHI] = "ghl";

      Names[DEF] = "def";

      Names[GHI] = "ghi";

};

これにより、列挙型が変更されても、配列は影響を受けません。このアプローチの欠点の 1 つは、テーブルにアクセスする前に関数を呼び出す必要があることです。

どのアプローチが良いか提案してください。テーブルは約 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 に答える