好的,自从我用 C++ 编写以来已经有一段时间了。而且我从来没有做过这么高水平的安静的事情。
所以基本上我需要创建一个类。类的构造函数需要从另一个类或函数中获取对方法的引用(或指针)。
基本上我有一个类需要偶尔从 fltk 评估器(版本 1.1.x)中读取一个值,然后更改一些关于它自己的东西。每个对象都有自己的评估器与之关联。(它们还具有指向同一父对象的另一个对象的链接,在从评估器更新它们后会告诉更新,依此类推)
那么我如何在构造函数中传递函数呢?
好的,自从我用 C++ 编写以来已经有一段时间了。而且我从来没有做过这么高水平的安静的事情。
所以基本上我需要创建一个类。类的构造函数需要从另一个类或函数中获取对方法的引用(或指针)。
基本上我有一个类需要偶尔从 fltk 评估器(版本 1.1.x)中读取一个值,然后更改一些关于它自己的东西。每个对象都有自己的评估器与之关联。(它们还具有指向同一父对象的另一个对象的链接,在从评估器更新它们后会告诉更新,依此类推)
那么我如何在构造函数中传递函数呢?
下面是一个示例,其中的方法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
。
您的构造函数可能看起来像这样:
// convenient typedef. This is for a pointer to a function in Foo
// The function returns void and takes no parameters.
typedef void (Foo::*FooPtr)();
class Bar {
public:
Bar (FooPtr foo_ptr);
};
查看一些 Web 参考以获取有关指向成员的语法的更多详细信息。如果你先熟悉它会容易得多。
作为附加说明,请查看函数 mem_fun 和 mem_fun_ref。这些可能会满足您的需求。
捕捉这一点的最简单方法是使用boost::function
. 它可以存储函数指针,也可以存储成员函数与对象绑定的结果。
例如,
class Foo {
Foo(boost::function<int(void)>);
};
将允许您接受任何整数来源。