2011-04-02 74 views
0

下面的代碼編譯成功,我百思不得其解:類模板偏Specialiazation

#include <stdio.h> 
#include <vector> 
#include <iostream> 

// Template definition 
template <typename T1, typename T2> class stack 
{ 
}; 

// Template specialization 
template <> class stack <float, float> 
{ 
}; 

int main() 
{ 
    stack <char, char> objStack; 
    return 0; 
}  

不偏專業化意味着我們可以使用類的一些特別數據類型,我們在專業化中指定?

沒有爲焦炭這裏沒有專門的班級,如果它打算與任何類型的數據類型來編譯那麼什麼是專業化的目的是什麼?

+0

我編輯了這個和其他答案,包括更多的標籤。在將來,儘可能完整地標記;一定要包含編程語言。 – GManNickG 2011-04-06 06:07:18

+0

@GMan謝謝,我認爲「特定」標籤會使搜索更好,因爲C++是一個非常廣泛的術語,無論如何,你是這裏的大人:) – 2011-04-06 06:12:03

+0

你部分正確。添加最常用的標籤,然後獲得更多更具體的內容。通過添加C++,對C++問題感興趣的人將會看到它。通過添加C++和模板,您將得到一個不僅喜歡C++的組,而且還喜歡回答有關模板的問題。所以你是對的,具體是好的,但首先建立在基礎上。乾杯。 :) – GManNickG 2011-04-06 06:14:36

回答

2

模板專門化適用於您希望針對特定模板參數做特別不同的事情。編譯器將實例化任何非原始模板中指定的內容。

這是當你想爲特定的數據類型不同的行爲是有用的,但也可用於更復雜的模式匹配,如改變爲指針類型的行爲,或const類型:

template <typename T> 
struct is_pointer { static bool value = false; }; 

template <typename T> 
struct is_pointer<T*> { static bool value = true; }; 

template <typename T> 
struct is_const { static bool value = false; }; 

template <typename T> 
struct is_const<const T> { static bool value = true; }; 

// later, try this: 
assert(is_pointer<int*>::value == true); 
assert(is_pointer<int>::value == false); 

所以,長話短說:除非你對某個參數有特殊的要求,否則不能指定你的模板,你不能概括爲基模板。模板專門化只是模式匹配的核心形式,可用於善與惡。

+0

感謝您的及時響應,我的想法是,當您希望該類僅用於指定的數據類型時,將使用部分特化。你的例子已經明確了這個概念。 – 2011-04-02 06:39:25

+0

而且在正常函數重載方面還有一個缺點,如果我們用「int」和「short」重載一個普通函數,並且我們調用相同的函數,如:f( 2),應該調用哪個上述實現?這個問題不會發生在類模板中,因爲我們必須使類的對象如下:'stack objStack;'。嗯,我還沒有看到它如何與「功能模板」,所以我不應該對此評論。 – 2011-04-02 06:40:40

2

模板專門化意味着採用通用模板並添加將用於特殊類型的類型或函數。部分專業化是指具有多個參數的模板類型或函數,並且不指定專業化中的所有參數。

在你的例子中,這個函數是通用模板。

// Template definition 
template <typename T1, typename T2> class stack 
{ 
}; 

它將被實例化爲任何類型,你給它除了如果你給兩個浮動。如果您給出兩個花車參數這個模板

// Template specialization 
template <> class stack <float, float> 
{ 
}; 

將被實例化。

+0

也謝謝你,這個概念現在對我來說很明顯:)新手不能投票發帖:rolleyes: – 2011-04-02 06:41:54

+0

沒問題,很高興聽到你現在有了想法;-) – ltc 2011-04-02 06:53:11

+0

剛剛投了票爲你... :) – 2011-04-02 06:56:50