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