tuple實現原理

2021-10-04 22:30:41 字數 2351 閱讀 1633

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