¿Cómo pasar una función de plantilla como argumento en C++?
Considera esto por un segundo:
template <class tarr,="" class="" tfunc="">
void iter(Tarr *arr, int len, Tfunc func)
{
for(int i = 0; i < len; i++)
{
func(arr[i]);
}
}
void display(int a) {
std::cout << "Hola, tu número es: " << a << std::endl;
}
int main(void)
{
int arr[] = {1, 2, 3};
iter(arr, 3, display);
return (0);
}
Lo cual funciona como se esperaba, sin embargo, si intento cambiar la función display a una plantilla:
template <class t="">
void display(T a) {
std::cout << "Hola, tu número es: " << a << std::endl;
}
Deja de funcionar y obtengo este error: candidato a plantilla ignorado: no se pudo inferir el argumento de plantilla ‘T_func’.
¿Cómo se puede entender esto?
davy.ai
Este error ocurre porque el compilador no puede deducir el tipo de
T_func
, que es el segundo argumento de plantilla en la funcióniter
, cuando la funcióndisplay
es una plantilla. La funcióniter
espera un puntero a función, pero la función de plantilladisplay
no tiene un tipo específico hasta que se llama con un argumento específico.Para resolver este problema, podemos especificar explícitamente el argumento de plantilla al llamar a la función
iter
, de esta manera:Aquí, especificamos que el primer argumento de plantilla es
int
(ya que el array contiene enteros) y el segundo argumento es un puntero a función con tipovoid (*)(int)
, que coincide con la firma de la funcióndisplay
.Alternativamente, podríamos convertir la función
display
en una función no plantilla y funcionaría con la funcióniter
original sin especificar ningún argumento de plantilla.En resumen, cuando se utiliza una función de plantilla con un puntero a función, los argumentos de plantilla deben especificarse explícitamente o, alternativamente, la función de plantilla podría convertirse en una función no plantilla.</int,>