In C++, puoi avere una funzione che modifica una tupla di lunghezza variabile?

StackOverflow https://stackoverflow.com/questions/80348

  •  09-06-2019
  •  | 
  •  

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?

È stato utile?

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?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top