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