C++11的tuple元組

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;
}

輸出結果如下

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章