es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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?

Tags:  , , ,

Answer

  1. Avatar for 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ón iter, cuando la función display es una plantilla. La función iter espera un puntero a función, pero la función de plantilla display 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:

    iter<int, void="" (*)(int)="">(arr, 3, display<int>);
    

    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 tipo void (*)(int), que coincide con la firma de la función display.

    Alternativamente, podríamos convertir la función display en una función no plantilla y funcionaría con la función iter original sin especificar ningún argumento de plantilla.

    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);
    }
    

    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,>

Comments are closed.