7

我正在尝试理解以下示例,该示例类似于(但不等于)之前在 SO Help 上发布的示例,以了解 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);
}

这怎么可能,最外面的绑定函数知道它必须将第一个参数传递给第二个绑定(期望_1),并将第二个参数传递给第三个绑定(期望_2)?我看到这个的方式是首先评估内部绑定器,因此它们成为两个一元功能对象,稍后传递给less<int>对象的绑定器。当使用两个对象调用新创建的功能对象时,a转到第一个内部绑定,然后b转到第二个。如果我是对的,我们会使用_1两次。我一定是错的。我将再次重复我的问题以明确我的问题:外部活页夹如何知道在哪个内部活页夹中使用了哪个占位符?

4

1 回答 1

7

参数被打包在元组 (a,b) 中并传递给函子。然后内部函子决定它需要哪个元组元素,例如尝试:

boost::bind(&X::value, _1)(a,b)
boost::bind(&X::value, _2)(a,b)

更一般地说,每个值,无论它是常量/引用/占位符,都表示为函子,它接受参数元组并返回值。

bind(f, 10)(a) // still functor which discards arguments

现在,我不确定这就是 bind 的方式。然而,这就是凤凰实现其功能的方式。如果您想了解绑定/lambda 实现的机制,请查看 phoenix,它非常可扩展并且具有出色的文档。

于 2010-09-20T18:51:28.143 回答