c++ - 使用基类模板检测 is_base_of

标签 c++ templates c++14

给定代码:

template<typename T, typename Other = SomeDefault>
struct Cat { ... };

template<typename T>
struct Bengal : Cat<T> { ... };

template<typename T>
struct Persian : Cat<T, Something> { ... };

struct Siberian : Cat<int> { ... };

我如何实现特征 is_cat<T>这样

  • is_cat<Cat<int, float>> , is_cat<Bengal<double>> , is_cat<Persian<std::string>>is_cat<Siberian>std::true_type
  • is_cat<double> (以及其他不相关的类型)是 std::false_type

我认为std::is_base_of是正确的方向,但我不知道如何让它与基类的未知类型参数一起工作。

最佳答案

std::is_base_of在这里没有帮助,它只检查一个具体的基类是否是一个基类。但我们不是在寻找具体的基础,而是在寻找基类模板。为此,我们可以利用重载决议:

std::false_type is_cat_impl(...);
template <typename T, typename U>
std::true_type is_cat_impl(Cat<T,U>*);

template <typename T>
using is_cat = decltype(is_cat_impl(std::declval<T*>()));

对于 Cat<T,U> 的东西, Cat<T,U>*是比 ... 更好的匹配至于别的,那根本就不是一场比赛。


如果你还想匹配Siberian const& ,然后,正如 Oliv 所建议的,最好使用引用而不是指针:

std::false_type is_cat_impl(...);
template <typename T, typename U>
std::true_type is_cat_impl(Cat<T,U> const volatile&);

template <typename T>
using is_cat = decltype(is_cat_impl(std::declval<T&>()));

关于c++ - 使用基类模板检测 is_base_of,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51910808/

相关文章:

模板类中的 C++ 模板 static const 成员变量

c++ - 红黑树~1子删除

javascript - 是否有适用于 Adob​​e Air 应用程序的 JavaScript 模板引擎?

c++ - 如何声明自引用模板类型

c++ - 必须推迟成员变量的初始化。该类(class)的最佳设计选择是什么?

c++ - 无法在 C++ 中写入 4D vector (没有可行的重载 '=')

c++ - 使用程序在 C++ 中自动使用命令提示符

c++ - 派发良好模板功能的最佳方式

c++ - 如何制作 set<T>(args...) 方法?

c++ - 根据模板类型生成 lambda 主体(调用可调用对象并返回)