使用boost :: lambda或boost :: phoenix和std :: find_if

时间:2015-09-03 12:39:46

标签: c++ boost boost-phoenix boost-lambda

我有一个这样的课程

<div class="box">
    <span class="red box">
        <a class="elem" />
    </span>
</div>

$(document).ready(function () {
    var nodeName = $('.elem').closest('.box').prop('nodeName');
});

我想在充满Foo对象的向量上使用find_if,如下所示:

class Foo {
    public:
        int GetID() const { return m_id; }
    private:
        int m_id;
};

我不太清楚我要写的东西而不是???。我知道有一个_1与boost :: lambda或arg1与boost :: phoenix,但在那之后我不知所措。

修改

我尝试了以下无法使用的功能,即使我在很多示例中都看到过这样的功能。

std::find_if(foos.begin(), foos.end(), ???.GetID() == 42);

然后我收到以下错误:

  

错误C2678:二进制'==':找不到哪个运算符带有'const boost :: lambda :: lambda_functor'类型的左手操作数(或者没有可接受的转换)

1 个答案:

答案 0 :(得分:4)

在这种情况下使用boost::bind,这是C ++ 11之前最简单的方法。

std::find_if(foos.begin(), foos.end(), boost::bind(&Foo::GetId, _1) == 42);

如果您使用phoenix,可以使用phoenix::bind

std::find_if(foos.begin(), foos.end(),
phx::bind(&Foo::GetId, phx::placeholders::_1) == 42);

其中phx

namespace phx = boost::phoenix;

如果您可以使用C ++ 11 - 您可以使用std::bind或lambda函数

std::find_if(foos.begin(), foos.end(), 
[](const Foo& f) { return f.GetId() == 42; });