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

时间:2013-04-21 01:20:39

标签: c++11 template-specialization template-meta-programming typetraits

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

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

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

1 个答案:

答案 0 :(得分:1)

我不认为你可以为一个混合了类型和非类型参数的任意类模板做这件事。

你可以接近更多特定的参数集,但我不知道如何处理一般情况:

#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
{ };