繁体   English   中英

元功能检测通过CRTP继承的模板类

[英]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函数。

在Coliru上看到它!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM