C++ 模板技術和STL實戰開發(1)——模板機制剖析
阿新 • • 發佈:2018-11-22
模板
模板把函式或類要處理的資料型別引數化,表現為引數的多型性,成為類屬
個人思考:模板也是計算機的很重要的思想“抽象思想”的體現
模板解決的是邏輯結構相同,但具體資料元素型別不同的資料
引數化程式設計:
引數化程式設計有效地降低了開發成本,減少了出錯概率,這也是模板思想的起源
深入剖析:
問題1:第12行和第15行調的是同一個函式嗎?
函式模板與模板函式的辨析
函式模板:就是定義的一個帶有引數型別的函式
模板函式:
編譯器會把第12行換成 myswap<int>(a,b) ,第15行換成 myswap<double>(c,d) ,而把這兩個就叫做模板函式
所以在這裡生成了不同的模板函式,第12行和第15行調的不是同一個函式
問題2:通過函式模板生成的模板函式會不會引起和函式過載的衝突?
解釋:函式模板不提供隱式型別轉換,因此不許嚴格遵循T的型別定義
所以型別嚴格匹配是模板函式呼叫的先決條件
當普通函式和函式模板都符合呼叫規則的時候,優先使用普通函式;
因為普通函式在編譯期間就生成了函式體
而模板函式需要在呼叫時,編譯器才會編譯
在這種衝突的情況下,可以顯式地呼叫模板函式
總結:
編譯器在處理函式模板的時候,能夠生成任意型別的函式
根據呼叫的時機產生不同的函式:編譯器會堆函式模板進行二次編譯,
在宣告的地方對模板本身進行編譯,在呼叫的時候對引數化以後的具體呼叫進行編譯