c++從11標準開始就引入了乙個tuple元組,這種型別很方便的儲存各種不同型別的元素;我們知道在c++中,都需要乙個唯一確定的型別才能定義乙個變數和分配記憶體結構,那麼tuple具體是怎麼實現的呢?
我們來看乙個**:
void
printx()
template
<
typename type,
typename..
. types>
void
printx
(const type& arg1,
const types&..
. args)
intmain
(int args,
char
* ar**)
這個程式的輸出為:
100
args:
4hello
args:
3world
args:
23.14
args:
1200
args:
0
如果不了解c++11 模板特性的童鞋,對於這個**可能有點不理解,這裡做乙個解釋。
template
: 這一行中typename... types
定義乙個可變型別個數的模板宣告,並且types被稱為模板引數包,在這個宣告中:
void printx(const type& arg1, const types&... args)
: 在這一行中const types&... args
定義可變型別和個數的引數,args被稱作為函式引數包,在這個宣告中:
sizeof...(args)
: 這一行中計算引數包中引數的個數。
printx(args...);
: 這一行中args...
代表整個引數包。
所以從上面的呼叫可以發現,整個呼叫過程形成乙個遞迴呼叫,每次呼叫導致引數包的個數減少乙個,並且我們定義了乙個void printx()
函式為退出函式(引數包的個數為0, 代表空引數呼叫);
根據上面模板引數包的**,我們可以很容易的定義出乙個可變引數的類的模板引數的**定義,如下:
template
<
typename..
.values>
class
mytuple
;template
<
>
class
mytuple
<
>
;template
<
typename head,
typename..
. tail>
class
mytuple
>
:public mytuple
>
;int
main
(int args,
char
* ar**)
整個定義的t結構體如下:
那麼這個類是怎麼定義的呢?整體也可以定義成為遞迴狀態,如下:
第一次類型別為mytuple
, 此時繼承的是mytuple
.
第二次類型別為mytuple
, 此時繼承的是mytuple
.
第三次類型別為mytuple
, 此時繼承的是mytuple
。
第四次型別為mytuple
, 此時繼承的是mytuple<>
.
第五次為終止型別為mytuple<>
。
對於std::tuple
的實現原理其實跟這個也是一樣的,定義如下:
template
<
class
_this
,class..
. _rest>
class
tuple
<_this _rest...>
>
:private tuple<_rest...>
>
;
列表 元組(tuple)
1.建立和訪問元組 temp 1,2,3,4,5,6 temp 1 2 temp 5 6,temp 2 3,4,5,6 temp2 temp 1 temp2 2,3,4,5,6 元組的訪問同列表一樣 2.元組不能被修改 temp 1 9 traceback most recent call last...
kvo實現原理 KVC KVO實現原理
一 kvc運用了乙個isa swizzling技術。isa swizzling就是型別混合指標機制。kvc主要通過isa swizzling,來實現其內部查詢定位的。isa指標,如其名稱所指,就是is a kind of的意思 指向維護分發表的物件的類。該分發表實際上包含了指向實現類中的方法的指標,...
實現原理 Vuex的實現原理
你知道vuex如何工作的嗎?先來看下圖了解下 了解圖之後看來下 的實現原理吧 let vue class store this.mutations this.actions this.vm new vue const options if getters if mutations if action...