2011-05-23 135 views
0

當我研究關於「類模板部分特例」,我讀了下面的代碼C++類參數是什麼?

#include <iostream> 
using namespace std; 
template <typename T1, typename T2> 
class stream 
{ 
    public: 
    void f() { cout << endl << "stream<typename T1, typename T2>::f()"; } 
}; 

template <typename T1> 
class stream<T1, int> 
{ 
    public: 
    void f() { cout << endl << "stream<typename T1, int>::f()"; } 
}; 

int main() 
{ 
    stream<char, float> si ; 
    stream<double, int> sc ; 
    si.f(); 
    sc.f();  
    cout << endl; 
    return 0 ; 
} 

在上面的代碼,我不能看得懂行

class stream<T1, int> 

無論這兩個參數T1,int是該類或其他類的構造函數的參數嗎? 如果我們在< ...,...>中指定一些列表,那麼這是什麼?如何理解這一點?

回答

1

第一個模板採用2個泛型參數,第二個模板將在泛型參數和int指定時調用。這意味着你提供了一個不同的實現,例如當一組特定類型被髮送時的性能。

+0

我明白了,當我們稱之爲「stream sc」時這行第二個模板定義將被調用。其實我的疑問是行(第二個模板定義)「類流」是必要的?相反,我們可以在上面的一行「template 中指定它,爲什麼我們必須在下一行指定它,我的意思是我的類聲明? – osdevkid 2011-05-23 12:43:23

+0

它是這樣,你可以提供2個實現,一個真正的通用的(第一個)和更優化的第二個參數,任何以int作爲第二個參數的調用都將進入優化的實現。 – ColWhi 2011-05-23 12:51:22

0

如果你部分地專門化模板,你必須傳遞參數。這就是線路所做的。 stream是一個帶兩個參數的類模板。部分專業化將第二個參數固定爲int,同時保留第一個變量。因此,專業化少了一個論點(只有T1)。你必須告訴編譯器哪個參數是固定的,所以你必須將類型參數傳遞給模板。這在線路class stream<T1, int>中完成。

3

這是「類模板部分專業化」中的「部分」,您指定了一些但不是全部的模板參數。在您的main中,stream<double, int>與部分特化相匹配,因爲它的第二個參數是int

0

參見維基百科

以下引用如果一個人知道,與特定數據類型相當頻繁類模板將被使用,這個數據類型允許一些優化(與整數例如比特移位,而不是乘以或除以2),可以通過指定另一個相同的類模板但通過指定參數類型來專門化模板。當編譯器在代碼中看到這樣的類模板實例時,它通常會選擇與實例相匹配的最專用的模板定義。因此,如果所有模板參數都匹配,那麼顯式特化(所有模板參數都被指定的特化)將優於部分特化。

因此,這是爲了幫助編譯器優化模板。