**:
這次要講的內容是:c++11中的tuple(元組)。tuple看似簡單,其實它是簡約而不簡單,可以說它是c++11中乙個既簡單又複雜的東東,關於它簡單的一面是它很容易使用,複雜的一面是它內部隱藏了太多細節,要揭開它神秘的面紗時又比較困難。
tuple是乙個固定大小的不同型別值的集合,是泛化的std::pair。和c#中的tuple類似,但是比c#中的tuple強大得多。我們也可以把他當做乙個通用的結構體來用,不需要建立結構體又獲取結構體的特徵,在某些情況下可以取代結構體使程式更簡潔,直觀。
構造乙個tuple
tuple這個tuple等價於乙個結構體char*, int>tp = make_tuple(sendpack,nsendsize); //
構造乙個tuple
struct用tupletp就可以不用建立這個結構體了,而作用是一樣的,是不是更簡潔直觀了。還有一種方法也可以建立元組,用std::tie,它會建立乙個元組的左值引用。a;
auto tp = return std::tie(1, "再看看如何獲取它的值:aa", 2
);//tp的型別實際是:
std::tuple
const還有一種方法也可以獲取元組的值,通過std::tie解包tuplechar* data = tp.get
<0>(); //
獲取第乙個值
int len = tp.get
<1>(); //
獲取第二個值
int通過tie解包後,tp中三個值會自動賦值給三個變數。x,y;
string
a;std::tie(x,a,y) = tp;
解包時,我們如果只想解某個位置的值時,可以用std::ignore佔位符來表示不解某個位置的值。比如我們只想解第三個值時:
std::tie(std::ignore,std::ignore,y) = tp; //還有乙個建立右值的引用元組方法:forward_as_tuple。只解第三個值了
std::mapm;它實際上建立了乙個類似於std::tuple型別的tuple。m.emplace(std::forward_as_tuple(
10, std::string(20, '
a')));
我們還可以通過tuple_cat連線多個tupe
int輸出結果:main()
(10, test, 3.14, foo, bar, 10, test, 3.14, 10)到這裡tuple的用法介紹完了,是不是很簡單,也很容易使用,相信你使用它之後就離不開它了。我前面說過tuple是簡約而不簡單。它有很多高階的用法。它和模板元關係密切,要介紹它的高階用法的時候,讀者需要一定的模板元基礎,如果你只是把它當乙個泛型的pair去使用時,這部分可以不看,如果你想用它高階用法的時候就往下看。讓我們要慢慢揭開tuple神秘的面紗。
通過std::tuple_element獲取元素型別。
templatevoid fun(tuple&tp)獲取tuple中元素的個數:
tuple t;
int size = std::tuple_size::value;
因為tuple的引數是變長的,也沒有for_each函式,如果我們想遍歷tuple中的每個元素,需要自己寫**實現。比如我要列印tuple中的每個元素。
templatestruct
tupleprinter
};template
struct tupleprinter1>
};template
void printtuple(const std::tuple&t)
namespacedetail
};template
struct find_index<0, t, args...>
};}template
int find_index(std::tupleconst& t, t&&val)
intmain()
#include #include看到這裡,想必大家對tuple有了乙個全面的認識了吧,怎麼樣,它是簡約而不簡單吧。對模板元不熟悉的童鞋可以不看tuple高階用法部分,不要為看不懂而捉急,沒事的,高階部分一般用不到,知道基本用法就夠用了。#include
template
struct
template
::std::forward
(f), ::std::forward(t),
::std::
get1>(::std::forward(t)),
::std::forward
(a)...
))};
template
<>
template
-> decltype(::std::forward(f)
(::std::forward
(a)...))
};template
::type
::std::forward
(t)))
void one(int i, double
d)int two(int
i)//
測試**
intmain()
tuple和vector比較:
vector只能容納同一種型別的資料,tuple可以容納任意型別的資料;
vector和variant比較:
二者都可以容納不同型別的資料,但是variant的型別個數是固定的,而tuple的型別個數不是固定的,是變長的,更為強大。
C 11中的Tuple和可變引數模版
c 11中的tuple是乙個n元的可變元組,它相當於有n個元素的結構體,只不過這個結構體的成員都是匿名的,tuple中提供了乙個get 方法來獲取某個下標對應的元素的值。另外可以通過make tuple 方法來構造乙個tuple物件。具體用法如下 我們知道tuple中的元素個數是不確定的,而每個元素...
C 11新特性tuple多元陣列
tuple是c 11新的標準庫之一,其表示n元陣列,它相當於有n個成員的結構體,只不過這個結構體的成員都是匿名的。tuple是類似於pair的模板,tuple像是pair的泛化版本,pair只能存放兩個成員,而tuple則可以多個成員,相同的是,pair和tuple都允許其成員的型別不一樣。tupl...
C 中對元組理解Tuple
陣列合併了相同型別的物件,而元組合並了不同型別的物件。元組起源於函式程式語言 如f 在這些語言中頻繁使用元組。在.net4中可以支援使用元組。例如,tuple包含 個元素,tuple包含兩個元素,以此類推。例1 元組型別相同 private tuple divide int dividend,int...