Вот пример, где метод Foo
передается конструктору Bar
, а затем вызывается для данного Bar
объекта:
struct Foo
{
int z;
int add(int x, int y)
{
return x + y + z;
}
int mul(int x, int y)
{
return x * y * z;
}
};
typedef int (Foo::*foo_method)(int, int);
struct Bar
{
foo_method m;
Bar(foo_method m) : m(m) {}
int call_on(Foo* foo)
{
return (foo->*m)(4, 2);
}
};
int main()
{
Bar bar(&Foo::add);
Foo foo = { 123 };
bar.call_on(&foo);
}
Если, с другой стороны, вы уже знаете объект Foo
во время создания Bar
, тогда Bar
не имеет значения, к какому классу относится метод. Все, что ему нужно - это функтор для последующего вызова, а объект Foo
может быть просто связан клиентом.
#include <functional>
struct Bar
{
std::function<int (int, int)> f;
Bar(std::function<int (int, int)> f) : f(f) {}
int call()
{
return f(4, 2);
}
};
using namespace std::placeholders;
int main()
{
Foo foo = { 123 };
Bar bar(std::bind(&Foo::add, &foo, _1, _2));
bar.call();
}
Если у вас нет компилятора C ++ 0x, замените std::bind
на std::tr1::bind
или boost::bind
.