Для этого вам нужно написать свою собственную черту:
template<typename>
struct is_specialization_of_A : std::false_type {};
template<typename T, int N>
struct is_specialization_of_A<A<T,N>> : std::true_type {};
template<typename T>
inline constexpr auto is_specialization_of_A_v = is_specialization_of_A<T>::value;
и аналогично для B
.
Вы также можете использовать шаблон как параметр шаблона шаблона для черты, так что вам нужно только одно определение признака, но оно работает только до тех пор, пока категории параметров шаблона совпадают. Здесь это не так (A
имеет <type, non-type>
, в то время как B
имеет <type, type, non-type>
).
template<typename, template<typename, auto> class>
struct is_specialization_of : std::false_type {};
template<template<typename, auto> class Tmpl, typename T, auto N>
struct is_specialization_of<Tmpl<T, N>, Tmpl> : std::true_type {};
template<typename T, template<typename, auto> class Tmpl>
inline constexpr auto is_specialization_of_v = is_specialization_of<Tmpl, T>::value;
Это можно использовать как is_specialization_of_v<A, T>
, но не is_specialization_of_v<B, T>
.