進入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 ...