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.

Variantes de sintaxis para puntero a función como argumento de plantilla no tipado.

Quiero usar un puntero a función como parámetro de plantilla sin tipo. Puedo hacerlo usando un alias predefinido para el tipo de puntero a función con typedef o using. ¿Hay alguna sintaxis para la definición de la plantilla sin un alias de tipo predefinido?

bool func(int a, int b) { return a==b; }

//using FUNC_PTR_T = bool(*)(int,int); // OK
typedef bool(*FUNC_PTR_T)(int,int); // también está bien

template < FUNC_PTR_T ptr >
void Check()
{
    std::cout << ptr( 1,1 ) << std::endl;
}

int main()
{
    Check<func>();
}

Quiero escribirlo en un solo paso como:

// esta sintaxis no compiló...
template < bool(*)(int,int) ptr >
void Check() 
{
    ptr(1,1);
}

¿Alguien puede señalarme una sintaxis válida para eso?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Desafortunadamente, no hay una sintaxis válida para definir un puntero a función como parámetro de plantilla sin tipo sin usar un alias predefinido como typedef o using. Lo más cercano que se puede conseguir es usar un especificador decltype para deducir el tipo del puntero a función cuando se pasa como argumento de plantilla:

    template <typename t="">
    void Comprobar(T ptr) 
    {
        ptr(1,1);
    }
    
    int main()
    {
        Comprobar(func);
    }
    

    En este caso, el compilador deducirá que el tipo de ptr es un puntero a función de tipo bool(*)(int,int) en función del tipo del argumento pasado (func). Esto requiere un paso adicional de pasar el puntero a función como argumento en lugar de directamente como parámetro de plantilla, pero se logra el mismo resultado.

Comments are closed.