概述
tuple表示一个不定数量的值的组合,即一个异质元素列,每个值的类型都要求被指定或者可以编译期推导。
使用
// 构造
tuple<int, float, string> t1(1, 2.3, "hello");
tuple<int, int, string> t2;
auto t3 = make_tuple(3, 4, "world");
// 赋值
// t1的第二个值赋值到t2
get<1>(t2) = get<1>(t1);
// 比较
// 类型tuple<int, int, const char*>将转化为tuple<int, float, string>以后进行比较
if (t1 < t2)
t1 = t2;
tuple不是寻常的容器,它不允许迭代元素,你必须在编译器知道你打算处理的元素的索引值
int i;
get<i>(t1); // 错误
make_tuple搭配ref()
函数可以提取tuple的值,其定义在<functional>头文件中
tuple<int, float, string> t(1, 2.2, "hello");
int i;
float f;
string s;
make_tuple<ref(i), ref(f), ref(s)> = t;
make_tuple生成的tuple具有三个引用,分别指向i, f, s,赋值操作将t的三个元素分别赋值给i, f, s,一种更简便的写法是使用tie()
,它会建立一个由reference构成的tuple
tie(i, f, s) = t;
std::ignore允许我们忽略某些tuple元素,从而局部提取tuple元素值
tie(i, std::ignore, s);
在tuple的构造函数中,接受不定参数的实参的版本被声明为explicit,这意味着不定参数的tuple必须被显式构造,因此以下写法是错误的:
tuple<int, double> t = {1, 2.2}; // 使用赋值符,发生隐式构造
vector<tuple<int, float>> v{{1, 2.2}, {2, 3.3}}; // 将初值列传至一个期望获得tuple的地方
tuple<int, double> f() {
return {1, 2.2}; // 将初值列传至一个期望获得tuple的地方
}