2010-09-20 51 views
7

我想了解下面的示例中,类似(但不等于)给一个在SO Help understanding boost::bind placeholder arguments早些时候发布: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)?我看到的方式是先评估内部活页夹,然后将它们变成两个一元功能对象,稍后传递给对象的活页夹。且当新创建的功能对象与两个对象被调用,a去所述第一内结合,并b转到第二。如果我是对的,我们会使用两次_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 

现在,我不是百分百确定这是如何绑定它。不过,这是凤凰城如何实现其功能。如果你想了解绑定/ lambda实现的机制,看看凤凰,它是非常可扩展的,并具有优秀的文档。

+0

好吧,我得到它。但是如果其中一个绑定参数不是活页夹,例如costant值?我的意思是:boost :: bind(std :: less (),boost :: bind(&X :: value,_1),10)(a);它如何知道应该为哪个参数分配生成的元组? – 2010-09-20 22:05:23

+1

@Mar我已经更新了我的答案,请随时查看 – Anycorn 2010-09-21 00:35:19