C 再學習系列 函式模板和類模板

2021-05-01 13:21:21 字數 646 閱讀 3044

函式模板和類模板

c++提供類模板和函式模板。函式模板允許過載 ,而類模板不允許過載(類無過載概念)。類模板可以進行全特化和偏特化,而函式模板僅能夠全特化 。因此,寫乙個看似函式模板偏特化的函式模板實際上是在寫乙個單獨的主函式模板!

由於函式模板可以過載,因此存在過載決議。但是記住,函式模板特化並不參與過載。只有在某個主模板函式被過載決議選中的前提下,其特化版本才有可能被使用。

因此,如果想要將乙個主模板特化,同時希望該特化版本能夠參與過載決議,那麼應該將使用普通函式而不是特化版本。(這是因為普通函式比函式模板優先順序更高)如果希望函式模板可以被特化、偏特化,應該使用類模板來封裝。類模板可以被偏特化。

總結:函式模板不能偏特化只能過載 ,函式模板的特化並不參與過載決議。這和直覺有點不同。

注意: 1.

對於模板函式。不能使用預設引數。預設引數僅僅對模板類有效。 2.

在編寫模板函式的過程中。函式體內所有使用到的型別都必須是已知的

(當然對於

template

中的引數型別。在函式體內也屬已經的型別

)。就是說不能在函式體內使用新定義的型別。如果使用像迭代器這樣的特化型別,需要使用

typename

做限定。如

typename vector::iterator it;

C 再學習系列 函式模板和類模板

函式模板和類模板 c 提供類模板和函式模板。函式模板允許過載 而類模板不允許過載 類無過載概念 類模板可以進行全特化和偏特化,而函式模板僅能夠全特化 因此,寫乙個看似函式模板偏特化的函式模板實際上是在寫乙個單獨的主函式模板!由於函式模板可以過載,因此存在過載決議。但是記住,函式模板特化並不參與過載。...

C 函式模板和類模板

一 函式模板 c 提供了函式模板 function template 所謂函式模板,實際上是建立乙個通用函式,其函式型別和形參型別不具體指定,用乙個虛擬的型別來代表。這個通用函式就稱為函式模板。凡是函式體相同的函式都可以用這個模板來代替,不必定義多個函式,只需在模板中定義一次即可。在呼叫函式時系統會...

函式模板和類模板(C )

所謂函式模板,實際上是建立乙個通用函式,其函式型別和形參型別不具體指定,用乙個虛擬的型別來代表。這個通用函式就稱為函式模板。函式模板和普通函式的區別 函式模板不允許自動型別轉化,普通函式能夠進行自動型別轉換 函式模板和普通函式在一起呼叫的規則 1 函式模板可以像普通函式一樣被過載 2 c 編譯器優先...