Va bene ho intenzione di dare un semplice esempio del mio problema:Perché non posso passare i parametri del modello su un altro modello?
void Increment(Tuple<int, int>& tuple) {
++tuple.Get<0>();
}
int main() {
Tuple<int, int> tuple;
tuple.Get<0>() = 8;
Increment(tuple);
printf("%i\n", tuple.Get<0>()); // prints 9, as expected
return 0;
}
Questo compila bene, e tutto è peachy. La funzione Increment incrementa solo il primo elemento della tupla, quindi stampo quell'elemento. Tuttavia, non sarebbe bello se la mia funzione Incremento potesse essere utilizzata su qualsiasi tipo di elemento?
template <typename T>
void Increment(Tuple<T, T>& tuple) {
++tuple.Get<0>(); // <-- compile ERROR
}
int main() {
Tuple<int, int> tuple;
tuple.Get<0>() = 8;
Increment<int>(tuple);
printf("%i\n", tuple.Get<0>());
return 0;
}
Il mio secondo esempio sputa fuori il seguente errore al momento della compilazione:
error: expected primary-expression before ')' token
Sono al mio ingegno fine cercando di capire perché questo provoca problemi. Poiché il parametro template è 'int', il codice generato deve essere identico a nell'esempio hard-coded. Come posso farlo funzionare?
La bruttezza e accorgimenti di utilizzo come indicato nella risposta di Gman è probabilmente la ragione per la quale sia std e aumentare tuple hanno un libero 'funzione di GET':' ++ ottenere <0> (tuple); ' – UncleBens