《C++ Template. The Complete Guide》筆記之一 緣起

來源:互聯網
上載者:User

從面對《Modern C++ Design》中backEnds.template的用法一無所知開始,要徹底搞清楚C++的模板是如果工作的決心其實已經埋下了。更何況今天在實現B樹的時候反覆被模板的編譯問題折磨著。更加堅定了看完這本《C++ Template. The Complete Guide》的信念。儘管過去對這個主題知道一些東西,什麼特化,偏特化,參數演繹等等。但是系統地看一看也是有必要的。當然在這裡學習的時候還是非常同意Nocolai的觀點,實用才是王道,因為我不是科學家也不可能成為科學家:)。

 

在這裡學習的開始,還是樂意重複一遍那個經典的主題:Why Templates?

理由很簡單,在設計資料結構或者演算法的時候,需要對不同的資料類型,但是相似的行為做描述。比如說你有一個QuickSort,你想讓他能對int,float, std::string都能夠排序。

你有很多辦法:第一就是你實現3個QuickSort, 參數分別是int[],float[],std::string[],這樣是可以工作的。但是帶來的問題顯而易見,如果你第一次實現的int的排序是錯的,那你完蛋了,你必須把這三個實現都改了。如果這個代碼是你一個人維護那勉強可以,如果很多人維護,別人可不知道有這樣的曆史在代碼裡面。所以這個方案是不妥當的。

第二個方法,其實是比較常見的,就是void*或者Object來取代具體的類型,每次我實現一個容器的時候push_back的內容都是Object&或者void*,用這個Object&或者void*來代替了具體的類型。這樣的好處是確實你不用重寫三分代碼了,但是問題一樣很明顯,用過了void*以後需要類型轉化,原先的類型資訊丟失了。在這樣的情況下,一個float也被類型轉化成了int加入到排序的隊列中,而這確實不顯示你的想法。如果Object&也一樣有問題,如果待排序的資料ObjectA同時繼承與ObjectB和ObjectC,而這兩個父類又都是Object的子類,那樣那個討厭的菱形有出現了!!!簡單的說這種對待排序參數強制的要求在維護性上是得不到很好的保證的。

當然,在模板沒有應用的時候,還有人用了宏定義來取代模板。讓我們來看看那些曾經熟悉的身影:

#define SWAP(a, b) { /<br /> a ^= b; /<br /> b ^= a; /<br /> a ^= b; /<br /> }<br />#define MAX(a, b) ((a) < (b) ? (b) : (a))<br />

如果不是那些C/C++的大師不斷強化這個MAX或者MIN的寫法,我想這種"stupid replacement mechanism"肯定會讓很多人抓狂。是的,這樣的宏定義太容易出錯了,在C++裡面,他不斷的被取代,簡單的函數變成了inline,值define編程了enum。總之C++的基調就是忘記宏,忘記預定義。

所以在這樣的時刻,在這個C#和Java都在推動template的時刻。我們還有什麼理由不用C++的模板呢?

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.