繁体   English   中英

如何检查模板特化是否是基本模板的子 class?

[英]How can I check if a template specialization is a child class of a base template?

使用检查 class 是否是模板专业化? ,我可以检查 class 是否是模板的专业化。

使用std::is_convertible<A*, B*> ,我可以检查 A 是否是 B 的子 class。

我怎样才能实现is_convertible_specialization ,这会做:

template<typename ... Args> 
class Base {};

template<typename ... Args> 
class Child : public Base<Args...> {};

template<typename ... Args>
class Unrelated{};

static_assert( is_convertible_specialization<Child<int, int>, Base>{} ); // True
static_assert( is_convertible_specialization<Unrelated<int, int>, Base>{} ); // False

我已经尝试了一些东西,但是我在 TMP 方面的技能相当缺乏,所以我认为我没有接近。 我的“最佳”尝试是:

template<template<class...> class ChildTemplate, template<class...> class Template, class... Args>
struct is_convertible_specialization : std::false_type {};

template<template<class...> class ChildTemplate, template<class...> class Template, class... Args>
struct is_convertible_specialization<ChildTemplate<Args...>, Template> : std::true_type {
    is_convertible_specialization() {
        static_assert( std::is_convertible<ChildTemplate<Args...> *, Template<Args...> *>());
    }
};

我尝试以一种对我来说似乎很简单的方式“嵌套”断言。 这为我提供了以下错误消息,这似乎含糊其辞,但对我来说并不是很容易理解。

Template argument for template template parameter must be a class template or type alias template

你很亲密。

首先,主模板(但不是特化)的模板参数必须与您希望使用模板的方式相匹配:

template <typename ChildTemplate, template<class...> class Template>

接下来,如果指针不可转换,则is_convertible_specialization的特化应评估为false ,而不是触发 static 断言。 您可以通过继承std::is_convertible_v<...>而不是std::true_type并删除自定义构造函数来做到这一点。

结果如下:

template <typename ChildTemplate, template<class...> class Template>
struct is_convertible_specialization : std::false_type {};

template <template<class...> class ChildTemplate, template<class...> class Template, class... Args>
struct is_convertible_specialization<ChildTemplate<Args...>, Template>
    : std::is_convertible<ChildTemplate<Args...> *, Template<Args...> *>
{};

暂无
暂无

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

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