[英]Metafunction to detect template class inheriting through CRTP
我有一个这样的界面:
template<typename Concrete, typename T>
class Interface{
...
}
它的具体实现:
template<typename T>
class Concrete : public Interface<Concrete<T>, T>
{
...
using type = typename T;
}
我想有一个元函数可以检查某个类型是否来自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函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.