C 11新特性(62) 模板函式的預設模板引數

2021-08-25 05:57:43 字數 1233 閱讀 5921

經典的例子

這是乙個相對簡單的特性,首先借用c++ primer中的示例**。

除了高亮的部分以外,就是乙個普通的模板比較函式。而高亮的部分就是本文的主題:模板函式的模板引數。這種寫法的含義就是如果程式設計師沒有指定第二個模板參 數,編譯器就預設使用less;如果程式設計師另外指定了模板引數,例如greater,那麼就使用指定的那個模板參 數。

觀察以下**:

第一行沒有指定第三個模板引數,並且1<2,所以返回-1;第二行另外指定了greater,執行的是相反的比較邏輯,返回1。

開發例項

c++11增加這個新特性肯定不只是用於比較運算的,但是想出乙個合適的例子還真是不大容易,作者勉為其難地想出來乙個。

有乙個xml檔案解析器,需要從不同的檔案中大讀入xml檔案,經過解析之後以另外一種形式輸出。作為代表,這裡有兩種檔案格式ascfile和zipfile,它們分別支援讀寫操作。

這兩個類沒有共同的基類,也沒有繼承意義上的其他關係,但是由於具有相同的呼叫形式,還是可以使用模板來實現另外一種意義上的抽象。

xmlparser類一共指定了兩個模板引數,分別是輸入檔案和輸出檔案。程式設計者可以根據需要分別指定。我們認為:一般情況下輸入檔案和輸出檔案是形同形式的。所以指定第二個模板引數的預設值是第乙個引數。使用xmlparser的示例**如下:

使用者可以自由組合輸入,輸出檔案的型別。

作者觀點

模板函式的預設模板引數用起來很方便,但是有一點一定要注意,就是省略引數的時候的動作一定要符合使用者的常識。如果這一點把握不好的話,反而可能造成另外的麻煩。

模板函式的預設模板引數很像函式的預設引數,無論是用法還是注意事項。

C 11 新特性 模板別名

豆子 2012年5月22日 c 參考文章 2002 年,iso c 標準化組織就已經提出了模板別名的概念。不過那時候還是叫做 typedef template。在接下來的幾年中,以 gabriel dos reis 和 bjarne stroustrup 為代表的開發者發展了這個想法,最終,我們在 ...

c 11新特性 lambda函式

lambda歷史悠久,在數理邏輯和電腦科學領域,lambda被用來表示一種匿名函式這種匿名函式代表了一種 演算 lambda calculus 但是在c 領域直到c 11才引入lambda表示式,本文先打算從lambda函式入手 後續會繼續從lambda與仿函式 lambda基礎應用 lambda的...

C 11 模板函式的預設模板引數

一 深入理解c 11 裡的兩句話 c 98中,引入了函式模板和類模板,允許模板類宣告的時候有預設模板引數,但是不支援函式模板。c 11 開始支援,區別是模板函式的預設模板引數不需要 從右往左 依次指定。特別,模板引數的預設形參不是模板引數推導的依據。二 include 模板類的預設模板引數的順序從右...