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