言語または標準ライブラリに元々組み込まれているため、これを行う簡単な方法はありません(ただし、最近追加されました)。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
必要に応じて、クラス以外の関数を使用できるようにサブクラス化することもできます。