2015-11-08 7 views
7

std::tie fornisce un modo conveniente per decomprimere il contenuto di una tupla in C++ in variabili definite separatamente, come l'esempio riportato di seguito illustraDisimballaggio tuple annidate in C++

int a, b, c, d, e, f; 

auto tup1 = std::make_tuple(1, 2, 3); 
std::tie(a, b, c) = tup1; 

Tuttavia, se abbiamo una tupla nidificata come sotto

auto tup2 = std::make_tuple(1, 2, 3, std::make_tuple(4, 5, 6)); 

tentativo di compilare il codice

std::tie(a, b, c, std::tie(d, e, f)) = tup2; 

fallisce con un errore

/tmp/tuple.cpp:10: error: invalid initialization of non-const reference of type ‘std::tuple<int&, int&, int&>&’ from an rvalue of type ‘std::tuple<int&, int&, int&>’ 
    std::tie(a, b, c, std::tie(d, e, f)) = tup2; 
          ^

C'è un modo idiomatico per decomprimere una tupla di tuple in C++?

+0

Possibile duplicato http://stackoverflow.com/questions/21298732/can-we-do-deep-tie-with-a-c1y-stdtie-like-function –

+1

È possibile creare una [tupla temporanea per l'annidamento] (http://ideone.com/s3YLG9), anche se non è così bello. – Cornstalks

risposta

4

Quando si sa che non v'è alcun rischio, è possibile convertire un riferimento rvalue ad un lvalue uno attraverso la seguente funzione di supporto:

template <class T> 
constexpr T &lvalue(T &&v) { 
    return v; 
} 

è quindi possibile utilizzarlo così:

std::tie(a, b, c, lvalue(std::tie(d, e, f))) = tup2; 

Nel tuo caso non c'è davvero alcun problema nel farlo, dal momento che la tupla interna deve essere viva solo per la durata dell'istruzione, ed è (esattamente) il caso.

+0

E 'possibile definire una funzione composita 'ltie', dove chiamare' ltie (a, b, c) 'equivale a chiamare' lvalue (std :: tie (a, b, c)) 'per semplificare codice per 'ltie (a, b, c, ltie (d, e, f)) = tup2'; – dzhelil

+1

Sfortunatamente non lo è. Se si seppellisce la tupla temporanea in una funzione, essa sarà locale per quella funzione e non vivrà abbastanza a lungo. Potresti renderlo una macro invece. – Quentin

+4

O semplicemente usa 'forward_as_tuple'. –