在成员函数部分的示例中:Member functions 我们得到了一个结构X:
struct X {
int foo(int);
};
首选语法
boost::function<int (X*, int)> f;
f = &X::foo;
X x;
f(&x, 5);
便携式语法
boost::function2<int, X*, int> f;
f = &X::foo;
X x;
f(&x, 5);
我的问题是:
人*人=新人(“涂”,23);
boost :: function newFunc2 = boost :: bind(&amp; Person :: printInfo,person);
答案 0 :(得分:2)
您需要传递X类型的对象,因为这是一个成员函数指针。您需要一个要调用该成员函数的对象。
可移植语法适用于较旧和较新的编译器,并且首选语法无法在较旧的编译器上编译。细节差异在functor tutorial page
函数对象是可以作为函数调用的对象。它可以是函数指针或成员函数指针
答案 1 :(得分:2)
任何成员函数都有一个指向要隐式设置为第一个参数的对象的指针。如果您有这样的代码:X x; x.foo(10);
编译器可能真的在为您调用foo(&x, 10)
(请参阅here了解可能的两种方法) - 显然,名称foo
会以某种方式受到损害。
有关语法的说明,请参阅Boost documentation。以下是该页面中最相关的摘录。基本上,如果您的编译器支持它,您应该使用首选版本,因为它最接近函数指针的正常定义(可读性)并使用较少的模板参数(更快的编译时间)。
Boost.Function有两种句法形式:首选形式和可移植形式。首选形式更符合C ++语言,减少了需要考虑的单独模板参数的数量,通常提高了可读性;但是,由于编译器错误,所有平台都不支持首选表单。兼容的表单适用于Boost.Function支持的所有编译器。请参阅下表以确定要用于编译器的语法形式。
函数指针是一个普通的旧指针,恰好接受具有特定返回类型和参数列表的函数。 函数对象是定义了operator()
的任何类型 - 允许将其作为函数调用。