C++ Utilizzando std :: tupla


Esempio

C ++ 11

Il tipo std::tuple può raggruppare qualsiasi numero di valori, potenzialmente inclusi valori di tipi diversi, in un singolo oggetto di ritorno:

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

In C ++ 17, è possibile utilizzare un elenco di inizializzazione rinforzato:

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

Il recupero dei valori dalla tuple restituita può essere complicato, richiedendo l'uso della funzione 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);

Se i tipi possono essere dichiarati prima che la funzione ritorni, allora std::tie può essere utilizzato per decomprimere una tuple in variabili esistenti:

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

Se uno dei valori restituiti non è necessario, è possibile utilizzare std::ignore :

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

I collegamenti strutturati possono essere utilizzati per evitare std::tie :

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

Se vuoi restituire una tupla di riferimenti lvalue invece di una tupla di valori, usa std::tie al posto di 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);
}

che permette

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

In alcuni rari casi utilizzerai std::forward_as_tuple invece di std::tie ; fai attenzione se lo fai, poiché i provvisori potrebbero non durare abbastanza a lungo per essere consumati.