如何检查模板专用化是否是基本模板的子类?
How can I check if a template specialization is a child class of a base template?
使用检查类是否是模板专用化?,我可以检查类是否是模板的专用化。
使用std::is_convertible<A*, B*>
,我可以检查 A 是否是 B 的子类。
我该如何实现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...> *>
{};
相关文章:
- 将QOpenGLWidget子类转换为使用Metal而不是OpenGL的子类是否可行?
- 检查某些类型是否是模板类 std::optional 的实例化
- 如何检查模板专用化是否是基本模板的子类?
- 是否可以子类 std::unique_ptr 透明地应用自定义删除器
- 如何检查对象是否是基类类型
- 使用回调来自定义类,而不是子类化
- 对仅接受特定类的子类的函数/类使用模板是否被认为是"correct"?
- 运算符<<重载继承,为什么我从基类而不是子类获得输入?
- 函数调用父类方法而不是子类方法
- 我能判断投射到父类中的对象类型最初是否是C++中的子类吗
- 如何检查类型是否是给定类模板的实例化
- 当 S 是 T 的普通子类时,在需要 T 数组的情况下使用 S 数组是否安全
- 检查子类的构造函数在C++中是否是公共的
- 用于检查模板类的某些特殊化是否是特定类的基类
- 当类是子类时重载赋值操作符
- 编译器调用基类方法而不是子类方法
- 在C++中,如何测试对象是否是父类构造函数中子类的实例?
- 可以删除抽象类而不是子类吗?
- 如何使用type_info来判断类型是否是子类
- C++模板:如何确定一个类型是否适合子类化