C++ 使用std :: tuple

示例

C ++ 11

该类型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中,可以使用大括号的初始化程序列表:

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);
C ++ 17

结构化绑定可用于避免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; 如果这样做,请当心,因为临时对象的使用时间可能不够长。