我可以使用typeid()来知道类型是否为枚举?

时间:2012-05-31 12:26:55

标签: c++ enums typeid

我能否以某种方式使用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中看过模板化的版本,但我们还不能使用这个库......

2 个答案:

答案 0 :(得分:3)

在最新的C ++标准C ++ 11中,已经存在用于检查(在编译时)类型是enum还是int的功能。

答案 1 :(得分:3)

您的方法存在两个问题:

  • 你假设名字是唯一的。它们不是(至少,标准不保证它们是)。
  • 您认为因为您可以检测到一种类型,您可以检测具有相同机制的系列。

如果您想知道变量的静态类型,编译时机制可能是最好的。这有特定的C ++ 11特征:std::is_enum<T>有一个value静态成员,它将是truefalse,具体取决于T是否为enum {1}}或不。{/ p>