使用 boost::lambda 或 boost::phoenix 与 std::find_if
using boost::lambda or boost::phoenix with std::find_if
我有一个class这样的
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);
然后我得到以下错误:
error C2678: binary '==' : no operator found which takes a left-hand operand of type 'const boost::lambda::lambda_functor' (or there is no acceptable conversion)
在这种情况下使用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; });
我有一个class这样的
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);
然后我得到以下错误:
error C2678: binary '==' : no operator found which takes a left-hand operand of type 'const boost::lambda::lambda_functor' (or there is no acceptable conversion)
在这种情况下使用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; });