使用 stdtuple

Version >= C++ 11

std::tuple 类型可以将任意数量的值(可能包括不同类型的值)绑定到单个返回对象中:

std::tuple<int, int, int, int> foo(int a, int b) { // or auto (C++14)
   return std::make_tuple(a + b, a - b, a * b, a / b);
}

在 C++ 17 中,可以使用支撑的初始化列表:

Version >= 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::tietuple 解包为现有变量:

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

Version >= 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; 如果你这样做要小心,因为临时可能不会持续足够长的时间来消耗。