最近在看c++的一些庫文件,裏面的一些比較陌生但看起來挺有用的一些東西,在此記下,以避免往後看到再翻找資料。c++
這是在看bitset的時候看到的,以前用bitset的時候也沒太留意,這是才發現bitset的類模板參數不是一個類型,而是一個數,這才發現原來類模板參數也能夠是一個數。數組
在C++ Primer
的654頁提到了Nontype Template Parameters就是指這個,來看一下他給的例子。函數
template <unsigned N, unsigned M> int compare(const char (&p1)[N], const char (&p2)[M]) { return strcmp(p1, p2); }
當咱們調用優化
compare("hi", "mom");
至關因而調用了指針
int compare(const char (&p1)[3], const char (&p2)[4])
也就是說Nontype Template Parameters跟咱們日常所用的模板實際上是相似的,只不過日常所用的模板參數是數據類型,而這個是數,bitset就是用這個來聲明bitset的位數。
這時,若是類中的一個常量成員與模板參數有關,那麼這個常量成員要設爲靜態常量,由於對於同一個實例模板,這個成員是靜態的(不隨新建對象而改變)。rest
operator type() const;
這是一個特殊的類成員函數,它的做用是將類轉化爲類型爲type的值,例如operator bool() const;
就是將類轉化爲bool,當類對象須要轉化爲type類型時,該函數就會被調用,與其它運算符函數不一樣的是,這個函數能夠直接調用,例如b.operator A()
就是調用b對象的類型轉換運算符A。code
咱們常常用new[]來新建一個數組,但這樣很容易出錯,若是不當心把頭指針弄丟了,那麼整個數組就沒了,並且新建出來的內存也會浪費掉,因此C++11新添加了一個array的數據新型,新建之後就當數組用就是了,並且與數組同樣,它的內存存儲是連續的。對象
bitset::insert(const_iterator position, value_type&& val)
上面代碼中的value_type&& val
就是右值引用的一個例子,在C++ Primer
的532頁有關於Rvalue Reference
的介紹,這個的主要使用是在對象要被釋放以前將對象的資源(內容)移出來,而不是進行復制操做,就像原文所說的:
Rvalue reference refer to objects that are about to be destroyed. Hence, we can "steal" state from an object bound to an rvalue reference.
在日常的使用中可能沒有感覺到右值引用帶來的好處,特別是對"steal"如何理解,我以爲知乎上Tinro的回答中對"steal"的解釋挺詳細的,經過右值引用這個概念能夠進行不少優化。內存
在看到這個的時候,我特別開心,由於我知道Matlab是有這個功能的,之前覺得C++沒有這個功能,以爲怪惋惜的,如今發現能夠這樣用,並且與tuple配合使用能夠產生許多好用的功能,舉個例子(C++ Primer
第700頁)element
template <typename T, typename... Args> void foo(const T &t, const Args&... rest);
這就是一個可變參數模板,其中Args是一個模板參數包,rest是一個函數參數包,所以foo函數的參數只要大於一個就行,下面是一些調用的例子
int i=0; double d=3.14; string s="variadic"; foo(i, s, 42, d); //包中有三個參數 foo(s, 42, "hi"); //包中有兩個參數 foo(d, s); //包中有一個參數 foo("hi"); //包中沒有參數
若是對rest進行取地址的處理,那麼獲得的會是rest裏面全部變量都取地址,用cout輸出時,只需cout << rest
便可按順序輸出參數。
但若是要對參數進行運算,就要用到tuple
這一數據類型,tuple
的每一個變量的類型均可以不同,支持取某個變量的類型,取值等操做,這樣只要把用(Args, rest)
新建一個tuple
,就能夠對裏面的值進行修改。下面是tuple
的例子
tuple< string, vector<double>, int, list<int> > someVal("constants", {3.14, 2.718}, 42, {0,1, 2, 3, 4, 5}); typedef decltype(someVal) trans; //trans: <string, vector<double>, int, list<int> > tuple_element<2, trans>::type cnt=get<2>(someVal); //tuple_element<2, trans>::type :取trans中的第2個類型,get<1>(someVal) :取someVal中的第2個數。 //因此cnt的類型爲int, 數值爲42