Estoy buscando las reglas que implican pasar plantillas de C ++ como argumentos.
Esto es compatible con C ++ como se muestra en 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>();
}
Sin embargo, aprender sobre esta técnica es difícil. Buscar en Google "función como argumento de plantilla" no conduce a mucho. Y las plantillas clásicas de C ++ La guía completa sorprendentemente tampoco lo discute (al menos no desde mi búsqueda).
Las preguntas que tengo son si se trata de C ++ válido (o solo una extensión ampliamente compatible).
Además, ¿hay alguna manera de permitir que un functor con la misma firma se use indistintamente con funciones explícitas durante este tipo de invocación de plantilla?
Lo 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 functor y viceversa, de forma similar a la forma en que puede pasar un puntero o functor de función al algoritmo std :: sort si desea definir una operación de comparación personalizada.
struct add3 {
void operator() (int &v) {v+=3;}
};
...
doOperation<add3>();
¡Apuntaría a un enlace web o dos, o una página en el libro de Plantillas C ++!
-std=gnu++17
. ¿Puedo usar el resultado de un operador de conversión lambda constexpr sin captura C ++ 17 como un argumento sin tipo de plantilla de puntero de función? .