Estoy buscando las reglas que implican pasar funciones de plantillas de C++ como argumentos.Función pasada como argumento de plantilla
Esto es apoyado por C++, como se muestra mediante un ejemplo aquí:
#include <iostream>
void add1(int &v)
{
v+=1;
}
void add2(int &v)
{
v+=2;
}
template <void (*T)(int &)>
void doOperation()
{
int temp=0;
T(temp);
std::cout << "Result is " << temp << std::endl;
}
int main()
{
doOperation<add1>();
doOperation<add2>();
}
aprendizaje de esta técnica es difícil, sin embargo. Googling for "function as a template argument" no conduce a mucho. Y el clásico C++ Templates The Complete Guide sorprendentemente tampoco lo discute (al menos no desde mi búsqueda).
Las preguntas que tengo son si esto es válido C++ (o simplemente una extensión ampliamente soportada).
Además, ¿hay alguna manera de permitir que un funtor con la misma firma se use indistintamente con funciones explícitas durante este tipo de invocación de plantilla?
El siguiente no funciona en el programa anterior, al menos en Visual C++, porque la sintaxis es obviamente incorrecta. Sería bueno poder cambiar una función para un funtor y viceversa, similar a la forma en que puede pasar un puntero a función o un funtor al algoritmo std :: sort si quiere definir una operación de comparación personalizada.
struct add3 {
void operator() (int &v) {v+=3;}
};
...
doOperation<add3>();
¡Se apreciarán los punteros a un enlace web o dos, o una página en el libro de Plantillas C++!
¿Cuál es el beneficio de una función como argumento de plantilla? ¿No se usaría el tipo de devolución en el tipo de plantilla? – DaClown