1

typeid/を使用して、type_info何らかの型がenum(任意の列挙子) であるかどうかを検出できますか?

以下は、変数に型があるかどうかを検出するためにうまく機能しますint

template<typename T>
bool is_int( T var )
{
  return strcmp( typeid(T).name(), typeid(int).name() ) == 0; 
}

しかし、列挙型に同様のバージョンを使用することはできません - name() によって返される文字列は Linux と Windows で異なります

template<typename T>
bool is_enum( T var )
{
  // can I use typeid here?
  // eg. string_contains( typeid(var).name(), "enum" ); 
}

Boost でテンプレート化されたバージョンを見たことがありますが、このライブラリはまだ使用できません...

4

2 に答える 2

3

最新の C++ 標準である C++11 には、(コンパイル時に) 型がenumまたはであるかどうかをチェックする機能が既にありintます。

于 2012-05-31T12:31:07.950 に答える
3

あなたのアプローチには2つの問題があります:

  • 名前が一意であると仮定します。そうではありません (少なくとも、規格はそうであることを保証していません)。
  • 1 つのタイプを検出できるため、同じメカニズムでファミリを検出できると想定します。

変数の静的な型を知りたい場合は、コンパイル時のメカニズムがおそらく最適です。これには特定の C++11 の特徴があります:であるかどうかに応じてorにstd::is_enum<T>なるvalue静的メンバーがあります。truefalseTenum

于 2012-05-31T13:06:27.780 に答える