绑定成员函数
Binding 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(&Person::printInfo,Person);
- 偏好语法和可移植语法之间的区别是什么?何时使用一种语法而不是另一种语法
- 什么是函数对象?那是函数指针吗
-
任何成员函数都有一个指向要操作的对象的指针,该指针隐式设置为其第一个参数。当你有这样的代码:
X x; x.foo(10);
时,编译器可能真的在为你调用foo(&x, 10)
(请参阅此处了解处理这一问题的两种方法)——显然,foo
这个名称在某种程度上已经被破坏了。 -
有关语法的描述,请参阅Boost文档。以下是该页面中最相关的摘录。基本上,如果编译器支持,您应该使用首选版本,因为它最接近函数指针的正常定义(可读性),并且使用更少的模板参数(更快的编译时间)。
助推。函数有两种语法形式:首选形式和可移植形式。首选形式更适合C++语言,并减少了需要考虑的单独模板参数的数量,经常提高可读性;然而,由于编译器错误,并非所有平台都支持首选形式。兼容的表单将适用于Boost支持的所有编译器。作用请参阅下表以确定编译器使用哪种语法形式。
-
函数指针是一个普通的旧指针,它恰好接受具有特定返回类型和参数列表的函数。函数对象是定义了
operator()
的任何类型,允许将其作为函数调用。
-
您需要传递X类型的对象,因为它是一个成员函数指针。您需要一个对象,在该对象上调用该成员函数。
-
可移植语法适用于较旧和较新的编译器,首选语法不能在较旧的编译器上编译。细节差异在函子教程页面中进行了解释
-
函数对象就是这样一个对象,您可以将其作为函数调用。它可以是函数指针或成员函数指针
- 如何使用指针传递给函数的数组中对象的函数成员
- c++构造函数成员初始化:传递参数
- 创建 std::函数,它返回具有函数成员值的变量.分段错误
- 如何在C++通过公共函数访问私有函数成员?
- 解释了构造函数成员初始化列表
- 调用std::函数成员时内存损坏
- 是否可以为模板类的模板函数成员设置别名?
- 捕获 lambda 函数C++成员变量
- 构造函数成员初始值设定项跨成员列出,安全吗?
- 获取与在模板参数中传递的函数成员类型相同的类
- 如何从公共函数成员访问地图私有成员
- C 构造函数成员分配优化
- 使用命名空间进行函数成员定义
- 函数成员作为 CUDA 内核的参数
- 模板基类函数成员的别名
- 函数成员中用于void和继承的enable_if
- 头文件中是否定义了一个很长的Class函数成员
- 类内/构造函数成员初始化
- 使用指向部分专用函数成员的指针自动填充向量
- 指向函数成员的指针