如何检查模板特化是否是基本模板的 child class?
How can I check if a template specialization is a child class of a base template?
使用 ,我可以检查 class 是否是模板的特化。
使用std::is_convertible<A*, B*>
,我可以检查A是否是B的childclass
我如何实现 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
而不是触发静态断言。您可以通过继承 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...> *>
{};
使用
使用std::is_convertible<A*, B*>
,我可以检查A是否是B的childclass
我如何实现 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
而不是触发静态断言。您可以通过继承 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...> *>
{};