Не существует простого способа сделать это так, как он изначально встроен в язык или стандартную библиотеку (хотя он был недавно добавлен). Если вы знакомы с Boost, они включают решение для этого - Boost.Function .
Если по какой-либо причине вы не можете или не хотите использовать Boost, существует общий способ сделать это с помощью шаблонов (что, по общему признанию, довольно похоже на решение 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);
}
Вы также можете создать подкласс FncPtr
, чтобы иметь возможность использовать функции, не относящиеся к классу, если хотите.