2011-07-11 13 views
1

大きなスイッチ回避/実行時にテンプレートの特殊化を照会する方法:私は列挙型持って

enum class MyEnumType { A , B , C }; 

をし、私は説明が属性にこれらの列挙型をマップしたいです。右、悪いこと

template <typename T> 
struct MyEnumTypeDescription 
{ 
inline const char* get() { static_assert("description not implemented for this type"); }; 
}; 

template<> 
const char* MyEnumTypeDescription<MyEnumType::A>::get() { return "A"; } 

template<> 
const char* MyEnumTypeDescription<MyEnumType::B>::get() { return "B"; } 

.... 

ビット冗長ではない:私はたくさんこのアプローチが好き?私は、実行時に列挙子からの説明を取得したいとき

は今、面倒である部分は、それは私が

const char* getDescriptionFromEnumerator(MyEnumType t) 
{ 
    case MyEnumType::A: 
     return MyEnumTypeDescription<MyEnumType::A>::get(); 
    ..... 
} 

ビッグスイッチ機能を作成する必要があることを意味しているいくつかのメタプログラミングがあります(テンプレートやマクロ)の魔法のようなものです。

答えて

1

私は、配列にマッピングすることをお勧め:

enum MyEnumType { A , B , C }; 
const char *pEnumDescription[] = { "A", "B", "C" }; 

とインデックスに基づいて、実行時に型を取得することができます。

const char* getDescriptionFromEnumerator(MyEnumType t) 
{ 
    return pEnumDescription[t]; // just one statement instead of switch/case 
} 
+0

これは素晴らしい解決策ですが、列挙型の宣言の近くで、ヘッダー内にある場合は、この配列を格納する適切な場所が心配です。名前空間で囲まれたグローバルデータに含める必要がありますか?別の.cppファイルにありますか? – lurscher

+0

@lurscherの場合、この配列を '.cpp'ファイルで定義し、' .h'ファイル(好ましくは 'enum'のすぐ近く)で宣言する必要があります。別の '名前空間 'を入れることができます。 – iammilind

関連する問題