2015-06-22 76 views
3

我想明白了一塊的C++代碼11功能相同。
類包含如下兩個功能:有和沒有模板

class abc 
{ 
public: 
    void integerA(int x); 

    template<typename typ> 
    void integerA(typ x); 
}; 

我無法理解宣佈2種相同功能的好處。爲什麼不聲明一個模板函數?

只有一個好處,我可以假設是,我們知道它可以傳遞給這個函數int數據類型。這可能會快一點。但是對於這個問題,我們是否真的需要用int數據類型創建一個單獨的函數?

+4

「我無法理解,宣佈2種相同功能的好處」:由於我們可能想要專門化'void integerA(int x)'來做其他事情。 – 101010

+0

@ 101010您可能想嘗試將其作爲答案。 – Sinkingpoint

+0

闡述101010指出的內容:如果用int參數調用integerA,則將調用非模板函數。如果用例如浮標或其他類型,例如一個你自己的類,這個模板函數將被調用。這允許你爲整數做一些特殊的事情。模板專門化機制是函數重載機制的擴展。這是相當強大的(有時有點複雜,尤其是與多個參數), –

回答

4

主要理由做這樣的事情是專門void integerA(int x)到別的做一些事情。也就是說,如果程序員提供作爲輸入自變量的int成員函數abc::integerA然後由於C++規則,而不是實例化該模板的成員函數,編譯器會選擇void integerA(int x)因爲具體功能是優選的,當可能的,而不是實例化一個模板版本。

一種更直接的方式來做到這一點是專門的模板成員函數以下列方式:

class abc 
{ 
public: 
    template<typename typ> 
    void integerA(typ x); 
}; 

template<typename typ> 
void abc::integerA(typ x) { 
    ... 
} 

template<> 
void abc::integerA(int x) { 
    ... 
} 

LIVE DEMO

+0

據我看了*過載*的OP的-approach比*專業化*辦法更好地在這裏建議,請參閱[爲什麼不專業生產函數模板? ](http://www.gotw.ca/publications/mill17.htm)。 – davidhigh

+0

@davidhigh我不會在這些問題上爭論,恕我直言,這是更多的味道問題。然而,似乎你提供的是打破了有趣的聯繫「未找到[CFN#0005]」 – 101010

+0

鏈接對我的作品 - 至少現在,我張貼後權利而作出的修改。在這裏你可以找到一些C++權威機構重載的參數......只是想說明一次。 – davidhigh