2012-09-06 118 views
0

如何從一個類中提取模板類型:提取模板類的類型,以供其他模板使用

例如,我有一個類,如:

template <typename T, typename T2 = def> 
class A 
{ 
    typedef T type; 
    typedef T2 type2; 
    //other stuff 
} 

而且我想在其他模板使用type2

template <typename G> 
foo(A<G> a) 
{ 
    //This doesn't work: 
    std::vector<a::type2> vec; 

    //Neither does this: 
    std::vector<a->type2> vec; 

    //or this: 
    std::vector<typename a::type2> vec; 

} 

那麼,如何找出type2是實例a(可a有VAL你是不是默認的type2)?

回答

4

這應該工作:

std::vector<typename A<G>::type2> vec; 

原因std::vector需要一個完整的類型作爲參數,只是Atemplate,但A<G>成爲一個完整的類型。從你的例子中,我已經提到了A<G>,但它可以是A<int>,A<char>什麼。

+0

對不起,我已經澄清了我的問題。我想要一個特定實例的類型......是可能的嗎? –

+0

@AndrewSpott,這不可能。但你爲什麼要那樣? 'a'是'A '的對象,不是一種類型。最終,'type2'屬於'A <...>',所以它'type2'必須從它所屬的地方提取。 – iammilind

+1

@ArewrewSpott:嵌套類型是* type *的一個屬性,而不是實例。沒有*類型的特定實例*,而是實例所屬類的類型。 –

0

如果您的編譯器支持它,您可以使用decltype功能命名對象的類型。

template <typename G> 
void foo(A<G> a) 
{ 
    std::vector<typename decltype(a)::type2> vec; 
} 

在這個例子中,decltype(a)是類型A<G>