8

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

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

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

+0

@rhalbersma,没有重复,其他的问题想知道如何告诉两个专业化是否使用相同的定义,即都使用主模板,或者两者都使用相同的部分专业化,或两者都使用相同的显式专业化。据我所知,这不是问题。 – 2013-04-22 12:20:33

+0

@Vincent,这个特质是否需要检测_any_类模板的使用,还是只适用于'MyClass'?我认为一般情况下使用类型和非类型参数混合使用类模板是不可能的。 – 2013-04-22 12:22:12

+0

@JonathanWakely删除了评论,似乎无法撤回近距离投票。 – TemplateRex 2013-04-22 12:26:39

回答

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 
{ }; 
+0

''decltype' on'template class U> T get_scalar(U );'如果您已经知道标量/非标量模式,将会让您找到标量类型。然而,我们没有“我将采用'模板',任何标量或'typename's”通配符模板参数。 – Yakk 2013-04-27 13:39:35