Bueno me voy a dar un ejemplo sencillo de mi problema:¿Por qué no puedo pasar los parámetros de la plantilla a otra plantilla?
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;
}
Esto compila bien, y todo es color de rosa. La función Incremento simplemente incrementa el primer elemento en la tupla, y luego imprimo ese elemento. Sin embargo, ¿no sería bueno si mi función Incremento pudiera usarse en cualquier tipo de 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;
}
Mi segundo ejemplo escupe el siguiente error en tiempo de compilación:
error: expected primary-expression before ')' token
Estoy en mis ingenios terminan tratando de averiguar por qué esto causa problemas. Como el parámetro de la plantilla es 'int', el código generado debe ser idéntico a mi ejemplo codificado. ¿Cómo puedo hacer que esto funcione?
La fealdad y la astucia del uso, como se muestra en la respuesta de GMan es probablemente la razón por la cual tanto std e impulsar tuplas tienen una función libre 'GET':' ++ obtener <0> (tupla); ' – UncleBens