绑定成员函数

Binding member functions

本文关键字:函数 成员 绑定      更新时间:2023-10-16

在成员函数部分的示例中:成员函数我们得到了一个结构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(&Person::printInfo,Person);

  • 偏好语法和可移植语法之间的区别是什么?何时使用一种语法而不是另一种语法
  • 什么是函数对象?那是函数指针吗
  1. 任何成员函数都有一个指向要操作的对象的指针,该指针隐式设置为其第一个参数。当你有这样的代码:X x; x.foo(10);时,编译器可能真的在为你调用foo(&x, 10)(请参阅此处了解处理这一问题的两种方法)——显然,foo这个名称在某种程度上已经被破坏了。

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

    助推。函数有两种语法形式:首选形式和可移植形式。首选形式更适合C++语言,并减少了需要考虑的单独模板参数的数量,经常提高可读性;然而,由于编译器错误,并非所有平台都支持首选形式。兼容的表单将适用于Boost支持的所有编译器。作用请参阅下表以确定编译器使用哪种语法形式。

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

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

  2. 可移植语法适用于较旧和较新的编译器,首选语法不能在较旧的编译器上编译。细节差异在函子教程页面中进行了解释

  3. 函数对象就是这样一个对象,您可以将其作为函数调用。它可以是函数指针或成员函数指针