C++ 如何检查模板专用化是否是基模板的子类?

C++ 如何检查模板专用化是否是基模板的子类?,c++,templates,template-meta-programming,C++,Templates,Template Meta Programming,使用,我可以检查类是否是模板的专用化 使用,我可以检查A是否是B的子类 我如何实现是可转换的\u专业化,可以做到: template<typename ... Args> class Base {}; template<typename ... Args> class Child : public Base<Args...> {}; template<typename ... Args> class Unrelated{}; static

使用,我可以检查类是否是模板的专用化

使用,我可以检查A是否是B的子类

我如何实现
是可转换的\u专业化
,可以做到:

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...> *>());
    }
};
模板
结构是\u可转换的\u专门化:std::false\u type{};
模板
结构是\u可转换的\u专门化:std::true\u类型{
是可转换的吗{
静态断言(std::is_convertible());
}
};
我试图以一种对我来说似乎很简单的方式“嵌套”断言。这为我提供了下面的错误消息,这似乎有点道理,但对我来说不是很容易理解

模板模板参数的模板参数必须是类模板或类型别名模板

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

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

明亮的我还没有找到std::bool_常量。谢谢。从
std::is_convertible
而不是
std::bool_constant
继承是否有效?
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...> *>
{};