2

我有这样的课

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);

我不太明白我必须写什么而不是???。我知道 _1 和 boost::lambda 或 arg1 和 boost::phoenix,但在那之后我不知所措。

编辑:

我尝试了以下不起作用的方法,即使我在许多示例中都看到了这样的情况。

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

然后我收到以下错误:

错误 C2678:二进制“==”:未找到采用“const boost::lambda::lambda_functor”类型的左侧操作数的运算符(或没有可接受的转换)

4

1 回答 1

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; });
于 2015-09-03T12:41:54.023 回答