C More C 模板推導

2021-08-03 04:53:13 字數 1985 閱讀 6662

進入c++11時代,大部分流行的庫都支援了c++11的新特性。c++11的新特性雖然有時候被詬病為語法糖,但是確實對開發很有助力,甚至有時候跟指令碼語言的簡潔度有的一拼了。其中自動模板推導是c++11的驚豔功能之一,如果僅僅知道auto和decltype是不夠的。以下筆記均以vs2013為準。

首先auto功能已經廣為人知,auto可以根據當前表示式自動推導出當前變數的型別。auto推導一般是不帶有引用&的,所以最好手動加&,即auto &;auto傾向於不帶有const,只有必要情況下才帶有const,比如容器是const引用,不用const迭代器不行。如下是不行的:

auto i; i=10;
這說明auto不能根據無關的上下文來推導。函式返回值可以用auto,比如:

auto foo(int i, int j)->decltype(i + j)

auto f = (int i, int j);

std::vector

vec = ;

decltype

0]> a = 10;//error!!

decltype

0]> b;//error!!

編譯器會報錯,提示a,b都是左值引用。我只是想獲取vector的模板,不需要引用啊?這時候有兩種做法:

1、使用value_type,即

decltype(vec)::value_type a=10

;

vetor的內部實現使用了type_traits技術,獲取模板型別非常簡單。

2、去引用:

typedef  std:

:remove_reference(annotationlist_):

:reference>

::type a = 10;

typedef std:

:remove_reference(annotationlist_[0])>:

:type a = 10;

第一種方法使用vector內部type_traits技術提供的模板引用。兩種方法使用了去引用功能,其內部實現很簡單,因為模板匹配會把const、&、*分離出來:

template

struct remove_reference ;

template

struct remove_reference;

按照這個想法,去除const和指標都是非常簡單的事情,僅展示部分:

template

struct remove_pointer;

template

struct remove_const ;

template

struct remove_const ;

template

struct remove_all ;

template

struct remove_allconst&> ;

同理還有新增的功能:

template

struct add_const_on_value_type;

template

struct add_rvalue_reference;

但是不要想著這麼高階就把新增const/&/*的功能也照上述方法寫一遍,其實直接在推導好的純淨模板上面新增const/&/*就行了。

在實現上述功能的檔案裡面,還有一些有意思的模板程式設計方法:

template

struct is_same ; };

template

struct is_same; };

template

struct is_const ; };

template

struct is_constconst> ;

模板型別推導 auto推導

effective modern c 果然是神書,乾貨滿滿,簡單記錄下。item1 模板推倒 典型的模板函式 temlate void fn paramtype param 要記住的東西 在模板型別推導的時候,有引用特性的引數的引用特性會被忽略 在推導通用引用引數的時候,左值會被特殊處理 在推導按值...

模板型別推導

param引用無const修飾template void f t param int x 1 const int cx x const int rx x f x f cx f rx 函式呼叫 t的型別 param的型別 f x intint f cx const int const int f rx...

C 模板型別推導

內容參考 effective modern c 中的條款1 int x 27 const int cx x const int rx x const int p x 1.paramtype是個指標或引用,但不是個萬能引用 去引用不去const template void f t param f x ...