C++的那些事 1


最近在看c++的一些庫文件,裏面的一些比較陌生但看起來挺有用的一些東西,在此記下,以避免往後看到再翻找資料。
c++

template <size_t _Nb>

這是在看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

Conversion Operator(類型轉換運算符)

operator type() const;

這是一個特殊的類成員函數,它的做用是將類轉化爲類型爲type的值,例如operator bool() const;就是將類轉化爲bool,當類對象須要轉化爲type類型時,該函數就會被調用,與其它運算符函數不一樣的是,這個函數能夠直接調用,例如b.operator A()就是調用b對象的類型轉換運算符A。code

array

咱們常常用new[]來新建一個數組,但這樣很容易出錯,若是不當心把頭指針弄丟了,那麼整個數組就沒了,並且新建出來的內存也會浪費掉,因此C++11新添加了一個array的數據新型,新建之後就當數組用就是了,並且與數組同樣,它的內存存儲是連續的。對象

Rvalue Reference(右值引用)

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"的解釋挺詳細的,經過右值引用這個概念能夠進行不少優化。內存

Variadic Template

在看到這個的時候,我特別開心,由於我知道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
相關文章
相關標籤/搜索