0

C++11 列挙型クラスが与えられた場合、コンパイル時にすべての列挙子のセットを反復処理するテンプレートまたはその他の構成要素はありますか? たとえば、その列挙型のすべての可能な値で配列を初期化するテンプレートを定義できますか?

4

2 に答える 2

3

代替手法の 1 つは、プリプロセッサに頼ることです。

#define ITERATE_MY_ENUM(_) \
  _(A,) \
  _(B, =3) \
  _(C,) \
  _(D, =10)

enum MyEnum {
  #define DEFINE_ENUM_VALUE(key, value) key value,

  ITERATE_MY_ENUM(DEFINE_ENUM_VALUE)

  #undef DEFINE_ENUM_VALUE
};

void foo() {
  MyEnum arr[] = {
    #define IN_ARRAY_VALUE(key, value) key,

    ITERATE_MY_ENUM(IN_ARRAY_VALUE)

    #udnef IN_ARRAY_VALUE
  };
}

見苦しいと思う人もいるかもしれませんが、それでもコードはDRYのままです。

于 2013-06-20T14:27:20.400 に答える
1

いいえ、そんなことはありません。また、列挙型は、列挙子の値だけでなく、論理和で結合されたそれらの任意の組み合わせ (あいまいに言えば) を保持できることに注意してください。

おそらく、単純なコード ジェネレーターを使用して問題を解決できるでしょう。

コメントの反映: クラス列挙型に関する C++11 の変更点の概要を以下に示します。それらは、暗黙的な変換、基になる型の制御、名前の範囲設定に対処しましたが、基本的な性質の変更はありませんでした。列挙子は、検出可能な接続のないリテラルに近いものにすぎません。あなたが求めていることは、ある種の反省を必要とするでしょう、私の知る限り、それはまだ地平線上にありません.

于 2013-06-19T15:35:14.373 に答える