使用 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; 如果你這樣做要小心,因為臨時可能不會持續足夠長的時間來消耗。