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();
   .....
}

このボイラープレートとエラーが発生しやすいコーディングをすべて回避するのに役立つメタプログラミング (テンプレートまたはマクロ) の魔法はありますか?

4

1 に答える 1

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
}
于 2011-07-11T03:37:40.177 に答える