绑定成员函数

时间:2011-05-28 09:39:00

标签: c++ boost function-pointers

在成员函数部分的示例中: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);

我的问题是:

  • 当我的int foo(int)只接受一个参数时,为什么还要添加一个额外的X *参数?此外,它与使用boost :: bind相同,例如:
  

人*人=新人(“涂”,23);

     

boost :: function newFunc2 = boost :: bind(&amp; Person :: printInfo,person);

  • 首选语法和可移植语法之间的区别是什么?何时使用另一种语法?
  • 什么是功能对象?那是函数指针吗?

2 个答案:

答案 0 :(得分:2)

  1. 您需要传递X类型的对象,因为这是一个成员函数指针。您需要一个要调用该成员函数的对象。

  2. 可移植语法适用于较旧和较新的编译器,并且首选语法无法在较旧的编译器上编译。细节差异在functor tutorial page

  3. 中说明
  4. 函数对象是可以作为函数调用的对象。它可以是函数指针或成员函数指针

答案 1 :(得分:2)

  1. 任何成员函数都有一个指向要隐式设置为第一个参数的对象的指针。如果您有这样的代码:X x; x.foo(10);编译器可能真的在为您调用foo(&x, 10)(请参阅here了解可能的两种方法) - 显然,名称foo会以某种方式受到损害。

  2. 有关语法的说明,请参阅Boost documentation。以下是该页面中最相关的摘录。基本上,如果您的编译器支持它,您应该使用首选版本,因为它最接近函数指针的正常定义(可读性)并使用较少的模板参数(更快的编译时间)。

      

    Boost.Function有两种句法形式:首选形式和可移植形式。首选形式更符合C ++语言,减少了需要考虑的单独模板参数的数量,通常提高了可读性;但是,由于编译器错误,所有平台都不支持首选表单。兼容的表单适用于Boost.Function支持的所有编译器。请参阅下表以确定要用于编译器的语法形式。

  3. 函数指针是一个普通的旧指针,恰好接受具有特定返回类型和参数列表的函数。 函数对象是定义了operator()的任何类型 - 允许将其作为函数调用。