Using Check if class is a template specialization?, I can check if a class is a specialization of a template.
Using std::is_convertible<A*, B*>
, I can check whether A is a child class of B.
How can I implement is_convertible_specialization
, something that would do:
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
I've tried a few things already, but my skills in TMP are rather lacking, so I don't think I've come close. My "best" attempt is:
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...> *>());
}
};
in which I attempt to "nest" assertions in a way that seemed simple to me. This provides me with the following error message, which seems vaguely sensible, but not really comprehensible for me.
Template argument for template template parameter must be a class template or type alias template