tuple是一个异质数据集合,是pair的扩展,支持任意数量元素。
tuple是TR1引入的,由于当时语言不支持不定参模板,所以最初的tuple元素个数是有限的。C++11引入不定参模板后,tuple得到重新实现。
tuple支持下列操作:
函数 | 作用 |
---|---|
tuple<T1,T2,…,Tn> t | 默认构造函数 |
tuple<T1,T2,…,Tn> t(v1,v2,…,vn) | 构造函数,以给定值完成初始化 |
tuple<T1, T2> t§ | 构造函数,以pair的元素值完成初始化 |
t = t2 | 赋值操作 |
t = p | 用pair对tuple进行赋值 |
==、!=、<、>、<=、>= | 比较操作 |
t1.swap(t2) | 交换t1,t2数据 |
swap(t1, t2) | 交换t1,t2数据 |
make_tuple | 以传参构造tuple对象并返回 |
tie(ref1, ref2, …) | 生成一个由引用构成的tuple,返回左值 |
get<>() | 获取指定元素 |
tuple_size<>::value | 元素个数 |
tuple_element<>::type | 元素类型 |
tuple_cat() | 拼接tuple |
tuple的拷贝构造函数、赋值运算符和pair一样,支持移动语义和隐式类型转换。
get<>()
tuple不是普通的容器,元素的类型是不确定的。为了进行编译期类型检查,get函数被声明为模板,模板传参指定了索引值,是值类型。所以调用时模板实参必须是编译期可以确定的数值。值得注意的是,get返回成员变量的引用,可以对其进行赋值更新:
std::tuple<int> t(1);
get<0>(t); // OK
get<0>(t) = 2; // OK
int i = 0;
get<i>(t); // error
tie<>()
tie使用变量的引用生成tuple对象,并返回其引用,所以可以利用tie提取tuple对象的元素:
int i, j;
std::tuple<int,int> t(1, 2);
std::tie(i, j) = t; // 提取两个元素
std::tie(std::ignore, j) = t; // 忽略第一个元素,提取第二个元素
辅助函数
tuple_size<tupletype>::value; // 可获得元素个数。
tuple_element<idx,tupletype>::type; // 可取得第idx个元素的类型(也就是get()返回值的类型)。·
tuple_cat(); // 可将多个tuple串接成一个tuple。