Boost.Bind - 理解占位符

时间:2010-09-20 18:34:00

标签: c++ boost boost-bind

我试图理解以下示例,它与早先在SO Help understanding boost::bind placeholder arguments上发布的示例类似(但不相同):

#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),第二个参数传递给第三个绑定(期望{ {1}})?我看到这个的方式是首先评估内部绑定器,因此它们成为两个一元函数对象,稍后传递给_2对象的绑定器。当使用两个对象调用新创建的功能对象时,less<int>转到第一个内部绑定,a转到第二个内部绑定。如果我是对的,我们会使用b两次。我一定是错的。我将再次重复我的问题以使我的问题清楚:外部活页夹如何知道哪个占位符用于哪个内部活页夹?

1 个答案:

答案 0 :(得分: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,它是非常可扩展的并且具有出色的文档。