VS2013 tuple 原始碼分析

2021-10-05 05:00:41 字數 2091 閱讀 1022

假如我們現在有如下原始碼:

tuplemy_tuple = make_tuple(1,2.2,"love")
好吧來看 vs2013實現原始碼:

// class tuple這裡是前置宣告

templateclass tuple;

template<>//這裡是特化版本,為了中止繼承

class tuple<>

//這裡是真正普通模板類

template//_rest 就對應 double 和 char* 組成的一包

class tuple<_this, _rest...>

: private tuple<_rest...>//這裡繼承於自己,當然也不是自己,因為模板引數不一樣

// class tuple_element

templatestruct tuple_element;

templatestruct tuple_element<0, tuple<_this, _rest...> >

;templatestruct tuple_element<_index, tuple<_this, _rest...> >//這裡tuple也會拆包,直到_index為0,此時我們想要取的值,為此型別tuple的成員變數。

: public tuple_element<_index - 1, tuple<_rest...> >//這裡_index 會遞減,直到第乙個模板引數為0 ;

// function get

templateinline//這個_types是 get函式的引數tuple的模板引數型別

typename tuple_element<_index, tuple<_types...> >::_rtype//這裡會根據_types進行遞減

get(tuple<_types...>& _tuple)//根據這裡的_tuple能夠推導出tuple的一包引數_types

編譯器程式設計可以執行期程式設計難多了。如果是執行期,可能會這樣:get(0),而編譯器是這樣get<0>()。妙哉妙哉。

// class _ignore

class _ignore

template//任何型別變數都可以賦值給此型別變數

void operator=(const _ty&) const

};const _ignore ignore;

// function tie

templateinline

tuple<_types&...>

tie(_types&... _args) _noexcept

再講講tuple_cat實現方式:

std::tuplemy_tuple1(1, 2.2);

std::tuplemy_tuple2("beijing");

std::tuple_cat(my_tuple1, my_tuple2);

templateinline

typename _tuple_cat1<_tuples...>::type

tuple_cat(_tuples&&... _tpls)

templateinline

_ret _tuple_cat(_arg_idx<_kx...>, _arg_idx<_ix...>, _ty&& _arg)

列印結果如下: 

struct std::_arg_idx<0,1,0>//上面這個和下面_arg_idx這個上下對應關係

struct std::_arg_idx<0,0,1>

class std::tuple&,class std::tuple&>

先取內層get _arg_idx的最後乙個模板引數即為1,即get<1>(my_tuple1)就得到my_tuple2,然後再呼叫外層get的_arg_idx的最後乙個模板引數0,即get<0>(my_tuple2)就得到了「beijing",這樣依次輪詢三次後,得到乙個模板引數包,_ret是返回型別tuple。用_ret強轉引數包得到了最終得tuple。

VS2013編譯python原始碼

系統 win10 手頭有個python模組,是用c寫的,想編譯安裝就需要讓python呼叫c編譯器。直接編譯發現使用的是vc9編譯,不支援c99標準 兩個槽點 為啥vs2008都還不支援c99?手頭這個c 為啥不好好寫?anyway,此時兩個想法,乙個是改c原始碼,另乙個是自行用vs2013編譯乙個...

vs2013之ref原始碼解析

看到很多地方都是用ref,比如thread繫結函式介面及引數,雖然繫結的函式引數需要引用,但是thread的建構函式不知道,還是會拷貝乙份臨時變數出來給函式,然後函式使用的是臨時變數的引用。無法達到使用者真正的需求 private ty ptr 裡面實際儲存的是乙個指標 address是獲取t的位址...

VS2013原始碼轉換VS2010的解決方法

近日有朋友得到vs2013的原始碼,但是他電腦又沒有安裝vs2013,也不想用vs2013,因為他用慣了vs2010。哪關鍵是怎樣用vs2010開啟vs2013的原始碼呢?一 用記事本開啟解決方案檔案如 bluethink.addressbook.sln 見前面幾行 microsoft visual...