Nie ma sposobu, aby to zrobić, jak pierwotnie wbudowano w bibliotekę językową lub standardową (chociaż ostatnio została dodana). Jeśli znasz Boost, zawierają rozwiązanie tego - Boost.Function.
Jeśli z jakiegoś powodu jednak nie jesteś w stanie lub nie chcą używać Boost jest rodzajowy sposób to zrobić przy użyciu szablonów (które, co prawda, jest dość podobna do Boost na rozwiązanie):
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);
}
Możesz również podklasę FncPtr
, aby móc korzystać z funkcji nieklasowanych, jeśli chcesz.
Sześć miliardów duplikatów. – Puppy
@DeadMG: pokaż im :) mój licznik utknął przy 2 178 933 wszystkich pytaniach – sehe
Jakich argumentów użyjesz, gdy zadzwonisz później? – Beta