Imagínese que tengo la siguiente función libre y funtor:Funciones/funtores como parámetros de plantilla. Pueden ser almacenados?
void myFreeFunction(void)
{
cout << "Executing free function" << endl;
}
struct MyFunctor
{
void operator()(void)
{
cout << "Executing functor" << endl;
}
};
según lo descrito por this answer, puedo pasar mi función o funtor como un argumento de plantilla a otra función:
template <typename F>
void doOperation(F f)
{
f();
}
y luego llamar a:
doOperation(myFreeFunction);
doOperation(MyFunctor());
Hasta ahora todo bien. Pero lo que si quiero algo como lo siguiente:
template<typename Callback>
class MyClass
{
private:
Callback mCallback;
public:
MyClass(){}
void execute()
{
mCallback();
}
};
En este caso estoy especificando la función/funtor cuando declaro la clase pero no llamándolo hasta más tarde. Funciona para funtores:
MyClass<MyFunctor> myClass1;
myClass1.execute();
Pero no por funciones:
MyClass<myFreeFunction> myClass2;
myClass2.execute();
compilador dice: C2923
error: 'MiClase': 'myFreeFunction' no es un argumento de tipo de plantilla válido para el parámetro 'Devolución de llamada'
Que es justo ... pero ¿cómo lo harías? estructura esto?
Nota: Conozco std :: function y puedo terminar usando esto. Sin embargo, es mucho más lento, así que estoy buscando todas las opciones.
Gracias,
David
usando boost :: bind() y boost :: function(), puede lograr lo que está buscando. Si está interesado, puedo dar un ejemplo. – Lou
Gracias, pero como señalé al final, ya conozco la función std :: como solución. Sin embargo, parece tener una sobrecarga de rendimiento como resultado de que la función no está en línea. – PolyVox