No hay simple forma de hacerlo originalmente construido en el idioma o la biblioteca estándar (aunque recientemente se ha agregado). Si está familiarizado con Boost, incluyen una solución para esto: Boost.Function.
Si por alguna razón, sin embargo, no es capaz o no está dispuesto a usar Boost, hay una manera genérica de hacer esto usando las plantillas (que, sin duda, es bastante similar a la solución de Boost):
class FncPtr
{
public:
virtual int call(float, char, char) = 0;
};
template <typename T>
class ClassFncPtr : public FncPtr
{
int (T::*pt2Member)(float, char, char);
T *inst;
public:
ClassFncPtr(T* who, int (T::*memfunc)(float,char,char))
: inst(who), pt2Member(memfunc)
{
}
int call(float a, char b, char c)
{
return (inst->*pt2Member)(a,b,c);
}
};
template <typename T>
FncPtr * makeFuncPointer(T* who, int (T::*memfunc)(float,char,char))
{
return new ClassFncPtr<T>(who,memfunc);
}
También puede crear la subclase FncPtr
para poder usar funciones que no sean de clase, si lo desea.
Seis mil millones de duplicados. – Puppy
@DeadMG: muéstreles :) mi contador está bloqueado en 2,178,933 preguntas totales – sehe
¿Qué argumentos usará cuando lo llame más tarde? – Beta