Во-первых, позвольте мне представить вам частичное решение:
template <template <class...> class,
typename ...>
struct is_tbase_of:
std::false_type
{ };
template <template <class...> class Type,
typename ...Args>
struct is_tbase_of<Type, Type<Args...>>:
std::true_type
{ };
В обычных случаях он работает:
is_tbase_of<std::vector, std::is_integral<int>>::value; // false
is_tbase_of<std::vector, std::vector<int>>::value; // true
Но это не работает на шаблоне шаблона "meta-return", например:
template <template <class ...> class T>
struct quote
{
template <typename ...U>
using type = T<U...>;
};
using QVec = quote<std::vector>;
is_tbase_of<QVec::template type, std::vector<int>>::value; // false...
Я пробовал много вещей, пытаясь получить аргументы шаблона второго типа (чтобы сравнить цитированную спецификацию типа), но, похоже, я не могу заставить их работать. Даже специализация is_tbase_of
для quote
(который был бы менее общим, но достаточным вариантом), по-видимому, отправляет меня в черные углы сопоставления шаблонов шаблонов.