我有一个这样的界面:
template<typename Concrete, typename T>
class Interface{
...
}
以及它的具体实现:
template<typename T>
class Concrete : public Interface<Concrete<T>, T>
{
...
using type = typename T;
}
我想要一个可以检查某种类型是否来自
Interface
的元函数。举个例子,假设接口(interface)只有一个模板参数(因此它不会产生子模板类):
template<typename Concrete>
class A
{
...
}
class B : public A<B>
{
...
}
在这种情况下,我可以使用:
template<typename T>
struct is_A
{
static bool const value = std::is_base<A<T>, T>::value;
}
我的问题是在有额外模板参数的情况下生成类似元函数的最佳方法是什么。它应该看起来像:
template<typename T>
struct is_Interface{}
说清楚,我可以生产
template<template <class> class T>
struct is_Interface
{
using dummy_type = void;
static bool const value = std::is_base<Interface<T<dummy_type>, dummy_type>, T<dummy_type>>::value;
}
但我想要一些我传递具体类型而不是模板类的东西。
最佳答案
您可以使用重载解析:
template <template <class> class Concrete, class T>
std::true_type is_Interface_impl(Interface<Concrete<T>, T> *);
std::false_type is_Interface_impl(...);
template<typename T>
struct is_Interface : decltype(is_Interface_impl(std::declval<T*>())) { };
模板参数推导中允许派生到基类指针转换,这就是
is_Interface_impl
的第一个重载如何检测和匹配关系。如果转换无法发生,则应用 SFINAE 并且重载决议返回到 vararg 函数。See it live on Coliru!
关于c++ - 用于检测通过 CRTP 继承的模板类的元函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43912727/