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 中,已经有了检查(在编译时)类型是 anenum还是int.

于 2012-05-31T12:31:07.950 回答
3

您的方法有两个问题:

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

如果您想知道变量的静态类型,编译时机制可能是最好的。为此有特定的 C++11 特征:std::is_enum<T>有一个value静态成员,它将是truefalse取决于是否Tenum

于 2012-05-31T13:06:27.780 回答