该类型std::tuple可以将任意数量的值(可能包括不同类型的值)捆绑到单个返回对象中:
std::tuple<int, int, int, int> foo(int a, int b) { // 或自动(C ++ 14) return std::make_tuple(a + b, a - b, a * b, a / b); }
在C ++ 17中,可以使用大括号的初始化程序列表:
std::tuple<int, int, int, int> foo(int a, int b) { return {a + b, a - b, a * b, a / b}; }
从返回的值中检索值tuple可能很麻烦,需要使用std::get模板函数:
auto mrvs = foo(5, 12); auto add = std::get<0>(mrvs); auto sub = std::get<1>(mrvs); auto mul = std::get<2>(mrvs); auto div = std::get<3>(mrvs);
如果可以在函数返回之前声明类型,则std::tie可以使用这些类型将a解包tuple到现有变量中:
int add, sub, mul, div; std::tie(add, sub, mul, div) = foo(5, 12);
如果不需要返回值之一,std::ignore则可以使用:
std::tie(add, sub, std::ignore, div) = foo(5, 12);
结构化绑定可用于避免std::tie:
auto [add, sub, mul, div] = foo(5,12);
如果要返回左值引用的元组而不是值的元组,请使用std::tie代替std::make_tuple。
std::tuple<int&, int&> minmax( int& a, int& b ) { if (b<a) return std::tie(b,a); else return std::tie(a,b); }
允许
void increase_least(int& a, int& b) { std::get<0>(minmax(a,b))++; }
在极少数情况下,您将使用std::forward_as_tuple代替std::tie; 如果这样做,请当心,因为临时对象的使用时间可能不够长。