检测两种类型是否是同一类模板的特化?

Vin*_*ent 8 type-traits template-specialization template-meta-programming c++11

我想知道如何编写一个type_traits类来检测两个类型是否是同一个模板类的特化.最大的问题是它应该适用于混合类型/非类型模板类,如:

template <typename T, std::size_t N>
class MyClass {};
Run Code Online (Sandbox Code Playgroud)

有可能设计出这样的东西吗?

Jon*_*ely 2

我认为您通常不能对混合了类型和非类型参数的任意类模板执行此操作。

您可以接近更具体的参数集,但我不知道有什么方法来处理一般情况:

#include <type_traits>

template <typename T, std::size_t N>
class MyClass {};

// assume not the same
template<typename T, typename U>
struct my_trait : std::false_type
{ };

// both specializations of MyClass
template<typename T1, std::size_t N1, typename T2, std::size_t N2>
struct my_trait<MyClass<T1, N1>, MyClass<T2, N2>>
: std::true_type
{ };

// both specializations of some class template Templ<typename, std::size_t>
template<template<typename, std::size_t> class Templ, typename A1, std::size_t S1, typename A2, std::size_t S2>
struct my_trait<Templ<A1, S1>, Templ<A2, S2>>
: std::true_type
{ };

// both specializations of some class template Templ<typename...>
template<template<typename...> class Templ, typename... A1, typename... A2>
struct my_trait<Templ<A1...>, Templ<A2...>>
: std::true_type
{ };
Run Code Online (Sandbox Code Playgroud)