In C++, puoi avere una funzione che modifica una tupla di lunghezza variabile?
Domanda
In C++0x vorrei scrivere una funzione come questa:
template <typename... Types>
void fun(typename std::tuple<Types...> my_tuple) {
//Put things into the tuple
}
Per prima cosa ho provato a utilizzare un ciclo for on int i
e poi fai:
get<i>(my_tuple);
E quindi memorizza un valore nel risultato.Tuttavia, get
funziona solo su constexpr
.
Se potessi estrarre le variabili da tuple
e passarli a una funzione basata su modelli variadici. Potrei ricorrere molto facilmente agli argomenti, ma non ho idea di come estrarre le variabili dalla tupla senza get
.Qualche idea su come farlo?Oppure qualcuno ha un altro modo per modificarlo tuple
?
Soluzione
Poiché la "i" in
get<i>(tup)
deve essere una costante in fase di compilazione, l'istanziazione del modello viene utilizzata per "iterare" (in realtà ricorsiva) attraverso i valori.Le tuple boost hanno le meta-funzioni "lunghezza" ed "elemento" che possono essere utili qui - presumo che anche C++0x le abbia.
Altri suggerimenti
Boost.Fusion vale la pena dare un'occhiataPuò "iterare" oltre std::pair
, boost::tuple
, alcuni altri contenitori e i propri tipi di tupla, anche se non penso che supporti std::tuple
Ancora.
Per quanto ne so, le tuple C++ devono fondamentalmente essere gestite con la ricorsione;non sembrano esserci modi reali per comprimere/decomprimere le tuple tranne utilizzando l'unica gestione del modello variadico del sistema tipografico.
Dai un'occhiata alla sezione 6.1.3.4 di TR1, http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1836.pdf
get è definito sia per le tuple qualificate const che per quelle non const e restituisce il tipo di riferimento appropriato.Se modifichi la dichiarazione della funzione nel modo seguente:
template
void fun(typename std::tuple& my_tuple) {
//Put things into the tuple
}
Quindi l'argomento della tua funzione è una tupla non const e get ti consentirà di effettuare le assegnazioni necessarie dopo aver scritto l'iterazione utilizzando le informazioni fornite nelle risposte precedenti.
Dai un'occhiata alla mia risposta qui per un esempio di ricorsione del modello per svolgere gli argomenti di tupla in una chiamata di funzione.
Come posso espandere una tupla negli argomenti della funzione modello variadica?