2014-10-04 112 views
4

我有這樣的代碼:模板名稱不帶參數

template <typename A> 
class templatedclass { 
    public: 
    using type = templatedclass; 
}; 

template <typename A> 
class sinkstuff { 
    public: 
    void print() { 
     cout << "generic sinkstuff"; 
    } 
}; 
template <typename A> 
class sinkstuff <templatedclass<A>> { 
    public: 
    void print() { 
     cout << "partiallyspecialized sinkstuff"; 
    } 
}; 

template <typename NtoA> 
struct pass_parameter : sinkstuff<typename templatedclass<NtoA>::type> {}; 


int main() { 
    pass_parameter<int> obj; 
    obj.print(); 
    cout << is_same<templatedclass<int>, typename templatedclass<int>::type>::value; // 1, yes 
} 

我一直以爲「用指令」是對類固醇的類型定義。如何在不指定參數的情況下使用「templatedclass<int>::type」,即「templatedclass<int>::type<int>」?

是不是「使用type = templatedclass」只是文本替換?我錯過了什麼嗎?

+1

除了宏,沒有什麼是「只是文本替換」! – 2014-10-04 17:40:30

+0

相關:http://stackoverflow.com/q/25549652 – dyp 2014-10-04 17:51:39

+0

相關/重複:http://stackoverflow.com/q/8031823 – dyp 2014-10-04 17:52:11

回答

4

一個類的名字被「注入」到類中,這叫做注入類的名字。它類似於:

class my_class_name 
{ 
public: 
    typedef ::my_class_name my_class_name; 
}; 

(但這當然不能編譯,一類可能不具有相同的名稱作爲類的手動聲明的成員。)

類模板也有注入-class名,和它可以被用於指代類模板本身,或者當前的專業化(包括當前模板參數),這取決於上下文:

[temp.local]/1

贊正常(非模板)類,類模板具有注入類名稱。注入的類名稱可以用作模板名稱類型名稱。當它被用來與模板參數列表,作爲模板參數爲模板模板參數,或如在最終標識符闡述型說明符朋友類模板聲明的它指的是類模板本身。 否則,就相當於 隨後按模板參數包含在<>類模板的模板名稱

2

這和using指令沒有任何關係。在A<T>(和using指令在該範圍內)的定義內,說A與說A<T>相同。

這是你可能會寫同樣的理由:

template <typename T> 
struct A 
{ 
    void foo(const A&); 
}; 

代替

template <typename T> 
struct A 
{ 
    void foo(const A<T>&); 
}; 

有關詳細信息,搜索 「注入的類名」。

相關問題