tuple元組
是一個固定大小的不同類型的集合,是泛華的std::pair。和C#中的tuple類似,但是比C#的tuple強大得多。
我們也可以把它作一個通用的結構體來用,不需要創建結構體有獲取結構體的特徵,在某些情況下可以取代結構體,使程序更簡潔、直觀。
下面看看tuple的基本用法:
先構造一個tuple:
tuple<const char,int>tp=make_tuple(sendPack,nSendSize); //構造一個tuple
這個tuple等價於一個結構體
struct A
{
char p;
int len;
}
用tuple<const char*,int>tp就可以不用創建這個結構體了,而作用使一樣的。還有一種方法是使用std::tie,它會創建一個元組的左值引用。
int x=1;
int y=2;
string s="aa";
auto tp=std::tie(x,s,y);
//tp的類型實際是:std::tuple<int&,string&,int&>
再看看如何獲取元組的值:
const char* data=tp.get<0>(); //獲取第一個值
int len=tp.get<1>(); //獲取第二個值
還有一種方法也可以獲取元組的值,通過std::tie解包tuple。
int x,y;
string a;
std::tie(x,a,y)=tp;
通過tie解包後,tp中3個值會自動賦值給3個變量。解包時,如果只想解某個位置的值時,可以用std::ignore佔位符來表示不解某個位置的值。
比如
std::tie(std::ignore,std::ignore,y)=tp; //只解第3個值
還有一個創建右值的引用元組方法:forward_as_tuple。
std::map<int,std::string> m;
m.emplace(std::peicewise_construct,std::forward_as_tuple(10),std::forward_as_tuple(20,'a'));
它實際上創建了一個類似於std::tupe<int&&,std::string&&>類型的tuple。
我們還可以通過tuple_cat連接多個tupe,代碼如下:
//#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <tuple>
template<typename Tuple, size_t N>
struct tuple_print
{
static void print(const Tuple& t, std::ostream& os)
{
tuple_print<Tuple, N - 1>::print(t, os);
os << ", " << std::get<N - 1>(t);
}
};
// 類模板的特化版本
template<typename Tuple>
struct tuple_print<Tuple, 1>
{
static void print(const Tuple& t, std::ostream& os)
{
os << std::get<0>(t);
}
};
// operator<<
template<typename... Args>
std::ostream& operator<<(std::ostream& os, const std::tuple<Args...>& t)
{
os << "[";
tuple_print<decltype(t), sizeof...(Args)>::print(t, os);
os << "]";
return os;
}
int main()
{
std::tuple<int, std::string, float> t1(10, "Test", 3.14);
int n = 7;
auto t2 = std::tuple_cat(t1, std::make_pair("Foo", "bar"), t1, std::tie(n));
n = 10;
std::cout << t2 << std::endl;
return 1;
}
輸出結果如下