2014-10-02 104 views
1

假設我有一個類,可以採取類型和參數varadic號:如何專門化0可變參數的可變參數模板類?

template <typename T, typename... Args> 
class B 
{ 
    T<Args...> x; 
}; 

該類構成了一個別名類型,這將是這樣的基礎:

template <typename... Args> 
using AliasedType = B<T, Args...>; 

但有些情況下,T類型不是模板,在這種情況下,可變包的長度將爲0.但是,class B仍會嘗試使用一組空模板參數聲明此類型的實例,從而導致錯誤。因此,要解決這個問題,我試圖創造B模板專業化的,完全不varadic參數都:

template <typename T> 
class B<T> 
{ 
    T x; 
}; 

但這似乎並沒有工作。

爲了說明工作示例問題:

class A 
{ 
}; 

template <typename T, typename... Args> 
class B 
{ 
    T<Args...> x; 
}; 

template <typename T> 
class B<T> 
{ 
    T x; 
}; 

main() { 
    B<A> a; 
} 

輸出是:

error: ‘T’ is not a template T<Args...> x; 

Live example here

爲什麼沒有這個解決的特殊版本,接受非模板類型?我確信我在這裏錯過了一些非常明顯的東西......看起來像一個空的可變模板包不像我以前所想的那樣被解析爲「無」。

+4

你寫的代碼沒有意義。如果'T'是一種類型,則不能有'T '。 – 2014-10-02 23:32:25

+0

@KerrekSB好點.. – arman 2014-10-02 23:33:41

+0

顯然你可以用模板模板參數編寫一些*代碼,但是我完全不清楚你想要實現什麼,或者爲什麼。 – 2014-10-02 23:34:21

回答

3

這是一個想法。它可能不是最佳的,但它的工作原理。首先,您希望B的第一個參數成爲模板模板參數(否則甚至會針對有效參數出現錯誤)。對於非模板類型,您可以將該類型包裝在模板中。這甚至適用於基本類型,如double

template <template<typename...> class T, typename... Args> 
class B 
{ 
    T<Args...> x; 
}; 

template <typename T> 
struct MakeTemplate { 
    template <typename...> using type = T; 
}; 

template <typename T> 
class Testclass { 
    T datamember; 
}; 

main() { 
    B<MakeTemplate<double>::type > b1; 
    B<Testclass,int> b2; 
} 

編譯沒有問題,你可以看到here。可能這是你想要的嗎?這就是說我只想提一提,除了聲明成員變量x(在B)之外,如果您需要訪問提供的類的模板參數,則只需要完整的邏輯。否則,您可以通過完全指定的類,並填寫所有參數,即B< Testclass<double> >B<double>,在這種情況下,B只需要一個模板參數,並且始終爲typename /類而不是模板。

相關問題