Mar*_*son 7 c++ boost boost-bind
我试图理解下面的例子,它类似于(但不相同)之前发布的SO 帮助理解boost :: bind占位符参数:
#include <boost/bind.hpp>
#include <functional>
struct X {
int value;
};
int main() {
X a = { 1 };
X b = { 2 };
boost::bind(std::less<int>(),
boost::bind(&X::value, _1),
boost::bind(&X::value, _2))
(a, b);
}
Run Code Online (Sandbox Code Playgroud)
这怎么可能,最外层绑定函数知道它必须将第一个参数传递给第二个绑定(期望_1),第二个参数传递给第三个绑定(期望_2)?我看到这个的方式是首先评估内部绑定器,因此它们成为两个一元函数对象,稍后传递给less<int>对象的绑定器.当用两个对象调用新创建的功能对象时,a转到第一个内部绑定,然后b转到第二个内部绑定.如果我是对的,我们会使用_1两次.我一定是错的.我将再次重复我的问题以使我的问题清楚:外部绑定器如何知道哪个占位符用于哪个内部绑定器?
参数包含在元组(a,b)中并传递给仿函数.然后内部函子决定它需要哪个元组元素,例如尝试:
boost::bind(&X::value, _1)(a,b)
boost::bind(&X::value, _2)(a,b)
Run Code Online (Sandbox Code Playgroud)
更一般地说,每个值,无论它是常量/引用/占位符,都表示为带有参数元组并返回值的函子.
bind(f, 10)(a) // still functor which discards arguments
Run Code Online (Sandbox Code Playgroud)
现在,我不是百分之百确定这是绑定的方式.然而,这就是凤凰实现其功能的方式.如果您正在尝试理解bind/lambda实现的机制,请查看phoenix,它是非常可扩展的并且具有出色的文档.
| 归档时间: |
|
| 查看次数: |
5449 次 |
| 最近记录: |