如何检查模板参数的类型?

新手上路,请多包涵

假设我有一个模板函数和两个类

class animal {
}
class person {
}

template<class T>
void foo() {
  if (T is animal) {
    kill();
  }
}

如何检查 T 是动物?我不想在运行时进行检查。谢谢

原文由 WhatABeautifulWorld 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 754
2 个回答

使用 is_same

 #include <type_traits>

template <typename T>
void foo()
{
    if (std::is_same<T, animal>::value) { /* ... */ }  // optimizable...
}

通常,这是一个完全不可行的设计,但你真的想 _专攻_:

 template <typename T> void foo() { /* generic implementation  */ }

template <> void foo<animal>()   { /* specific for T = animal */ }

另请注意,具有显式(非推导)参数的函数模板是不寻常的。这并非闻所未闻,但通常有更好的方法。

原文由 Kerrek SB 发布,翻译遵循 CC BY-SA 3.0 许可协议

std::is_same() 仅从 C++11 开始可用。对于 C++11 之前的版本,您可以使用 typeid()

 template <typename T>
void foo()
{
    if (typeid(T) == typeid(animal)) { /* ... */ }
}

原文由 scai 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题