2011-08-14 41 views
1

我正在閱讀C++ primer plus並且有一些問題了解隱式實例如何工作。我還沒有學過類,所以我只是在處理函數。我想我理解隱式實例化(函數模板)的基礎知識,但我不明白顯式實例化。我有一個使用模板的函數,有人可以告訴我,如果使用明確的實例化,將如何編寫這樣的函數。你可以改變它的工作方式,但保持簡單。我真的很感激。這將幫助我理解語法以及如何使用它。C++顯式實例化 - 函數模板 - 替換一個隱式實例化來學習它

2 #include <iostream> 
    3 
    4 template <typename T> 
    5 void show(T,T); 
    6 
    7 
    8 int main() 
    9 { 
10 int a = 10, b = 12; 
11 char c = 'x', d = 'y'; 
12 
13 show(a,b); 
14 show(c,d); 
15 
16 return 0; 
17 } 
18 
19 template <typename T> 
20 void show(T a, T b) 
21 { 
22 std::cout << "I used the int version " << a << " " << b << "\n"; 
23 } 
+0

哎呀對不起,我一直在搞亂它,我忘了把它放在我的例子中。你知道如何將此函數轉換爲顯式實例嗎?我編輯了我的函數來顯示這 –

回答

3

只要做一個Show<int>(c, d)請注意,我已明確實例化了int版本,但傳遞了char參數。這是(一個相當簡單的)明確的實例,但你可能實際上是指explicit specialization

+0

他不能談論模板專業化,因爲它不存在的功能模板... – PierreBdR

+0

@PierreBdR - 你說得對,*明確的專業化*是我一直在尋找。編輯。我知道這樣的事情存在,只是忘了它被稱爲... – Schnommus

+0

@ Schnommus - 既不,它被稱爲顯式實例化。功能模板再次沒有專門化。 – PierreBdR

0

將模板看作代碼生成類似於複製/粘貼的位置,您可以用具體類型代替T。 「實例化」是將代碼複製粘貼到程序中的過程。

每當您使用模板時都會發生隱式實例化。對於函數模板,具體類型是從函數參數中推導出來的,並且爲該類型實例化模板。所以,你的代碼實際上就變成:

void show(int a, int) { std::cout << "I used the int version " << a << " " << b << "\n"; } 
void show(char a, char) { std::cout << "I used the int version " << a << " " << b << "\n"; } 

int main() { /* as it was */ } 

明確實例化,而另一方面,就明確地強制編譯器生成的代碼。舉例來說,如果我們添加了顯式實例

template void show(double, double); 

你的代碼,編譯器會生成相應的代碼,

void show(double a, double) { std::cout << "I used the int version " << a << " " << b << "\n"; } 

這會發生,不管你是否真正使用該代碼。


如果您不知道有關類呢,那麼你就錯過樂趣的92%,因爲類模板實例是更爲微妙。只有實際使用的成員函數被隱式實例化,而顯式實例化爲所有類成員創建代碼。此外,類成員函數在實際實例化之前不會進行正確性檢查,因此您可以編寫實際上對於所有可能的類型都沒有意義的模板。

0

如果你意味着int專業化(你提到顯式實例),那麼它可以爲:

template <typename T> 
void show(T,T); 

template <> // specialization (not overloading) for 'int' 
void show(int a, int b) 
{ 
    std::cout << "I used the int version " << a << " " << b << "\n"; 
} 

如果你真的想這樣做顯式實例則是可以做到的是:

show<int>(a,b); 

這實際上在這種情況下實際上是多餘的。

+0

這是不正確的。你正在談論模板專業化,它不適用於模板功能。你的代碼其實是不正確的。 – PierreBdR

+0

@PierreBdR,[代碼正確](http://www.ideone.com/TzB8x)。模板功能確實存在'模板'特化。你爲什麼覺得這是不正確的。 – iammilind

+1

對不起,我混雜了部分專業。此外,我從來沒有見過功能專業化甚至有用的情況。 – PierreBdR

0

要顯式實例化您的函數,您需要明確指定類型。在你的例子中,用show替換掉電話:隱含的實例只是意味着編譯器可以根據參數的類型找出intchar