Вы не можете использовать указатель на функцию в качестве делегата с состоянием;вместо этого вам нужен класс, который перегружает оператор вызова функции, operator()
.Это можно вызывать как функцию, а также удерживать состояние, например, определенный объект, для которого вызывается функция-член.
В C ++ 11 одна опция - std::function
:
typedef std::function<int(int*,int)> delegate;
using namespace std::placeholders;
FunctionalPointers fp; // no need for "new" here
delegate d = [&](int * p, int a){fp.IncrementCounter(p,a);};
int result = d(ptr, a);
В C ++ 03 вы можете использовать boost::function
и boost::bind
для достижения того же самого или написать свой собственный класс с перегруженным operator()
, например:
class Delegate {
public:
typedef int FunctionalPointers::*member_fn(int*,int);
Delegate(FunctionalPointers * fp, member_fn fn) : fp(fp), fn(fn) {}
int operator()(int * p, int a) {return (fp->*fn)(p,a);}
private:
FunctionalPointers * fp; // Object to call member function of
member_fn fn; // Member function to call
};
FunctionalPointers fp;
Delegate d(&fp, &FunctionalPointers::IncrementCounter);
int result = d(ptr, a);
хотя вам понадобится немного больше работы, чтобы получить полиморфное поведение или std::function
.