Tengo este problema donde se guarda un puntero de función C++, junto con un conjunto de argumentos para invocarlo, de modo que se pueda llamar más tarde. El código de llamada desconoce el tipo y los argumentos de las funciones. Guardar y llamar punteros a función y argumentos es extremadamente crítico para el rendimiento en mi aplicación. La interfaz debe ser algo como esto:Puntero de función de guardado + argumentos para su uso posterior
void func(int a, char * b);
call_this_later(func, 5, "abc");
Una solución sencilla es poner toda esta información en un funtor, lo que requiere un typedef diferente por cada llamada de función. C++ 11 me permitiría hacer eso usando una plantilla variadica, así que eso está bien.
Como no se conoce el tipo de functor en el punto de llamada, parece necesario crear una clase base virtual para estos funtores e invocar a los funtores mediante llamadas a funciones virtuales. La sobrecarga de rendimiento de las llamadas a funciones virtuales + la asignación de heap es demasiado alta (estoy ampliando los límites de la implementación de este modismo con las pocas instrucciones de ensamblaje posibles). Entonces necesito una solución diferente.
¿Alguna idea?
Creo que ':: boost :: function' y' :: std :: tr1 :: function' hacen exactamente lo que @Hans no quiere hacer. Creo que usan funciones virtuales y asignación dinámica. – Omnifarious
@Omnifarious: depende de la función/functor utilizado en cuanto a si hay alguna asignación dinámica. para funciones con un pequeño número de tipos de POD, hay un almacenamiento interno que usará; sin embargo, sí hace uso de una tabla virtual (muy profunda) oculta para poder realizar la llamada a la función. – diverscuba23