剖析std tuple原理並實作乙個

2021-10-06 12:23:44 字數 2225 閱讀 9202

完整**位置

// 測試**

#include

"wtuple.h"

#include

intmain()

std::tuple用以當做泛化的pair使用,其構建原理非常值得研究;

實現原理:

1.通過對自身泛化模板的「遞迴繼承「,以實現記憶體結構上的巢狀;

例如

std::tuple<

char

,short

,int

,double

>將繼承自

①.std::tuple <

short

,int

,double

>

(繼續「遞迴」繼承)

②.std::tuple <

int,

double

>

③.std::tuple <

double

>

④.std::tuple <

>

// tuple原始版本

template

<

typename..

. __args_type>

class

tuple

;// tuple無參

template

<

>

class

tuple

<

>

virtual

~tuple()

};// tuple的帶參偏特化

template

<

typename __this_type,

typename..

. __args_type>

class

tuple

<__this_type, __args_type ...

>

:public tuple<__args_type ...

>

virtual

~tuple()

__this_type get_value()

public

:// 每一層繼承的節點引數剝離

// 將每一節點內容儲存至其中

__this_type value_;

};

2.取出tuple中的值,通過對tuple下標的展開,得到對應繼承的tuple原型,即可呼叫介面獲取對應的節點value_

例如std::tuple應用std::get<1>時將展開到std::tuple型別,以此型別轉換原tuple物件,即可呼叫get_value介面;

template

<

int n,

typename..

. __args_type>

auto

get(tuple<__args_type ...

>

& tu)

通過上述中的element模板展開tuple模板,萃取其中的基類tuple型別,原始碼如下:

// element原始版本

template

<

int n,

typename..

. __args_type>

struct element;

// n > tuple size時get出錯

template

<

int n>

struct element>>

;// tuple展開模板

template

<

int n,

typename __this_type,

typename..

. __args_type>

struct element>>

:public element1, tuple<__args_type ...

>>

;// 展開到對應節點

template

<

typename __this_type,

typename..

. __args_type>

struct element<

0, tuple<__this_type, __args_type ...

>>

;

WCF初接觸實作 一

我們通過實現乙個簡單的示例來對wcf有個直觀而淺顯的認識,希望對初次涉及wcf的朋友有所幫助。可以簡單地認為wcf程式分為4部分 契約 服務 宿主 客戶端。我們通過乙個例子來逐步完成各部分,示例程式中,客戶端可以獲取乙個資訊列表,列表中每一項包括id 值 讀值時刻 狀態 狀態變動時刻。這裡我用的是v...

簡單實現乙個進度條並剖析原理

我們要實現關於乙個進度條,我們的想法是採用for迴圈的方式,所以對於這個進度條,我們需要從下面幾個問題來一一看待問題。這兩個符號,乙個叫做回車,乙個叫做換行,好多人對這兩個分不清,所以我們在這裡需要介紹一下。在最早的時候,只有打字機的時候,人們在每行的後面加上兩個表示結束的字元,乙個叫做回車,它把打...

hadoop 一 深度剖析hdfs原理

在配置hbase集群將 hdfs 掛接到其它映象盤時,有不少困惑的地方,結合以前的資料再次學習 大資料底層技術的三大基石起源於google在2006年之前的三篇 gfs map reduce bigtable,其中gfs map reduce技術直接支援了apache hadoop專案的誕生,big...