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

using boost::lambda or boost::phoenix with std::find_if

本文关键字:boost find if std phoenix lambda 使用      更新时间:2023-10-16

我有一个这样的类

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

我想在一个充满Foo对象的向量上使用find_if,像这样:

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

我不太明白我应该写什么来代替??。我知道有boost::lambda的_1或boost::phoenix的arg1,但之后我就不知所措了。

编辑:

我尝试了下面的方法,尽管我在很多例子中都看到过这样的方法,但它不起作用。

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

然后得到以下错误:

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

在这种情况下使用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; });