缺少了C++模板真的不行嗎
首次進(jìn)行C++的初始學(xué)習(xí)時(shí),首先接觸到的就是C++模板,在創(chuàng)建C++模板時(shí)出現(xiàn)了一些困難和難以理解的地方,比如向上類型轉(zhuǎn)換,向下類型轉(zhuǎn)換等相關(guān)麻煩,對(duì)于除類型之外,其余都相同的函數(shù),我們一般有3種解決辦法。
1、針對(duì)每個(gè)不同的類型重復(fù)地編寫函數(shù)實(shí)體(C語(yǔ)言的做法):
- T const& f(T const& a, T const& b)
- {
- return a + b; //1處
- }
- int g = f(1,2);
2、使用Object(Java的做法)或者void*缺點(diǎn)有兩個(gè)效率問題方面也有問題類型檢查問題
3、使用宏預(yù)處理機(jī)制
缺點(diǎn):只是愚蠢的文本替換,而且也不會(huì)考慮作用域和類型安全。然而,應(yīng)用C++模板卻可以避免這些缺點(diǎn),我們可以編寫:
優(yōu)點(diǎn):
代碼簡(jiǎn)潔優(yōu)雅,所有參數(shù)類型都以T來(lái)代替,真正實(shí)現(xiàn)了類型無(wú)關(guān)性。更好的類型安全性,所有的類型檢查都是在編譯期進(jìn)行,而且避免使用指針。不存在繼承,效率高。(1)沒有虛函數(shù);(2)所有的一切工作都是在編譯期完成,大大提高運(yùn)行效率。目的:告訴編譯器如何做出最佳的選擇,而且這種選擇全部是在編譯期完成的。C++模板的機(jī)制:特化 和 實(shí)參演繹
- // traits/accumtraits3.hpp
- template
- lass AccumulationTraits;
- c template<>
- class AccumulationTraits {
- public:
- typedef int AccT;
- static AccT const zero = 0;
- };
- template<>
- class AccumulationTraits {
- public:
- typedef int AccT;
- static AccT const zero = 0;
- };
- template<>
- class AccumulationTraits {
- public:
- typedef long AccT;
- static AccT const zero = 0;
- };
- (2)policy:通常表現(xiàn)為某個(gè)函數(shù),指定的是一種行為
- class SumPolicy {
- public:
- template
- static void accumulate (T1& total, T2 const & value) {
- total += value;
- }
- };
- (3)trait和policy的用法:
- template >
- class Accum {
- public:
- typedef typename Traits::AccT AccT;
- static AccT accum (T const* beg, T const* end) {
- AccT total = Traits::zero();
- while (beg != end) {
- Policy::accumulate(total, *beg);
- ++beg;
- }
- return total;
- }
- };
優(yōu)點(diǎn):由:全局特化->局部特化->基本C++模板,這種特化順序的選擇與匹配(重載解析規(guī)則)是由編譯器自動(dòng)進(jìn)行的,無(wú)需人工參與??梢愿鶕?jù)不同的情況(諸如類型不同,條件不同),給出不同的實(shí)現(xiàn),從而獲得更加靈活的針對(duì)性??梢葬槍?duì)任何變化,改善了程序的擴(kuò)展性。
實(shí)參演繹
第1部分介紹了模板的基本概念,以教程的風(fēng)格來(lái)介紹這些基本概念。第2部分闡述了模板的語(yǔ)言細(xì)節(jié),可以作為一本基于模板的構(gòu)造的參考手冊(cè)。第3部分介紹了C++模板所支持的基本設(shè)計(jì)技術(shù),范圍覆蓋從微小的概念一直延伸到復(fù)雜的用法;一些技術(shù)在別的書籍都沒有出現(xiàn)過。第4部分基于前兩部分,深入討論了各種使用C++模板的普通應(yīng)用程序。
【編輯推薦】