【问题标题】:using boost::lambda or boost::phoenix with std::find_if将 boost::lambda 或 boost::phoenix 与 std::find_if 一起使用
【发布时间】:2015-09-03 12:39:45
【问题描述】:

我有这样的课

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”类型的左侧操作数的运算符(或没有可接受的转换)

【问题讨论】:

  • 既然可以使用 c++11 标准,为什么还要自己做呢?
  • @David Haim:我希望我可以;)
  • std::find_if(foos.begin(), foos.end(), (&boost::phoenix::placeholders::_1->*&Foo::GetID)() == 42);
  • @Piotr Skotnicki:这给了我错误:无法从 'const boost::phoenix::actor *' 转换为 'const Foo *'

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


【解决方案1】:

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

【讨论】:

  • @gartenriese 你错了。在我的示例中只是增强绑定,而不是增强 lambda 绑定。看看我的例子,在你的例子中没有与实际值比较。
  • 天哪。如果我使用 boost::bind 而不是 boost::lambda::bind,它就可以工作。非常感谢,我从来没有猜到!
  • phoenix 版本不像你解释的那样工作。
  • @gartenriese 也可以。看:coliru.stacked-crooked.com/a/0e027c53f781ff63
  • 嗯,现在可以了。我一定忘记了一些标题。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-12
  • 1970-01-01
  • 1970-01-01
  • 2021-06-06
相关资源
最近更新 更多