C++ Usando std :: tuple


Ejemplo

C ++ 11

El tipo std::tuple puede agrupar cualquier número de valores, posiblemente incluyendo valores de diferentes tipos, en un solo objeto de retorno:

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

En C ++ 17, se puede usar una lista de inicializadores de arriostramiento:

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

La recuperación de valores de la tuple devuelta puede ser complicada, y requiere el uso de la función std::get template:

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

Si los tipos se pueden declarar antes de que se devuelva la función, entonces se puede emplear std::tie para descomprimir una tuple en variables existentes:

int add, sub, mul, div;
std::tie(add, sub, mul, div) = foo(5, 12);

Si uno de los valores devueltos no es necesario, se puede usar std::ignore :

std::tie(add, sub, std::ignore, div) = foo(5, 12);
C ++ 17

Los enlaces estructurados se pueden utilizar para evitar std::tie :

auto [add, sub, mul, div] = foo(5,12);

Si desea devolver una tupla de referencias de lvalor en lugar de una tupla de valores, use std::tie en lugar de 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);
}

lo que permite

void increase_least(int& a, int& b) {
  std::get<0>(minmax(a,b))++;
}

En algunos casos raros std::forward_as_tuple lugar de std::tie ; tenga cuidado si lo hace, ya que los temporales pueden no durar lo suficiente como para ser consumidos.