【问题标题】:Help me understand this usage of boost::bind帮助我理解 boost::bind 的用法
【发布时间】:2011-05-10 06:04:45
【问题描述】:

请查看 Johannes Schaub 发布的这个示例,以对向量对进行排序:

How do I sort a vector of pairs based on the second element of the pair?

std::sort(a.begin(), a.end(), 
          boost::bind(&std::pair<int, int>::second, _1) <
          boost::bind(&std::pair<int, int>::second, _2));

我以为我确实了解 boost::bind,但我对这个有问题。

问题 1:

排序算法需要一个谓词函数作为第三个参数。我在这里看到的是一个布尔表达式。我错过了什么?:

boost::bind(&std::pair<int, int>::second, _1) < boost::bind(&std::pair<int, int>::second, _2)

boost::bind 库是否对这两个绑定重载运算符

问题 2:
这让我很困惑:

boost::bind(&std::pair<int, int>::second, _1)

通常有某种函数指针作为绑定调用的第一个参数,但这里是类成员的地址?该特定绑定的结果是什么?

感谢您的时间和帮助

【问题讨论】:

    标签: c++ boost-bind


    【解决方案1】:

    boost::bind 重载了操作符!以及关系和逻辑运算符 ==、!=、、>=、&&、||,所以这就是为什么你“看到”一个布尔表达式,但实际上你得到的是一个函数谓词。

    从那里您可以看到您正在为重载的小于函数的第一个和第二个参数绑定该对的第二个成员。

    关于你的第二个问题: Boost bind 将识别您何时将指针传递给成员并将其视为您调用了

    bind<R>(mem_fun(&std::pair<int,int>::second), args);
    

    文档是这样描述的:

    将绑定与指向成员的指针一起使用

    指向成员函数的指针和 指向数据成员的指针不是 函数对象,因为它们不 支持运算符()。为了方便, bind 接受成员指针作为它的 第一个参数,行为如下 如果 boost::mem_fn 已用于 将成员指针转换为 函数对象。换句话说, 表达

    绑定(&X::f, args)

    等价于

    绑定(mem_fn(&X::f), args)

    其中 R 是 X::f 的返回类型 (对于成员函数)或类型 成员(对于数据成员。)

    你可以找到这个和更多信息here

    【讨论】:

      【解决方案2】:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-12-29
        • 1970-01-01
        • 1970-01-01
        • 2010-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多