【问题标题】:Boost.Bind - understanding placeholdersBoost.Bind - 理解占位符
【发布时间】:2010-09-20 18:34:00
【问题描述】:

我试图理解下面的例子,它类似于(但不等于)早先在 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),并将第二个参数传递给第三个绑定(期望_2 )?我看到的方式是首先评估内部绑定器,因此它们成为两个一元功能对象,稍后传递给 less&lt;int&gt; 对象的绑定器。当新创建的函数对象被两个对象调用时,a 进入第一个内部绑定,b 进入第二个。如果我是对的,我们会使用两次_1。我一定是错的。我将再次重复我的问题以明确我的问题:外部绑定器如何知道在哪个内部绑定器中使用了哪个占位符?

【问题讨论】:

    标签: c++ boost boost-bind


    【解决方案1】:

    参数被打包在元组 (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 是如何做到的。 然而,这就是凤凰实现其功能的方式。如果您想了解 bind/lambda 实现的机制,请查看 phoenix,它具有很强的可扩展性并且具有出色的文档。

    【讨论】:

    • 好的,我明白了。但是如果绑定的参数之一不是活页夹会发生什么,例如恒值?我的意思是: boost::bind(std::less(), boost::bind(&X::value, _1), 10)(a);它如何知道应该将生成的元组分配给哪个参数?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-01
    • 2019-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多