对于copy_if,boost :: lambda :: if_then

时间:2009-08-12 11:00:53

标签: c++ boost lambda if-statement

我一直试图通过以下代码模拟copy_if,但我的编译器(g ++ - 4.0)一直在抱怨。什么技术上错了?谢谢你的帮助!

template <class STL> // a std container of class A, but I don't know if it's a list or vector or deque
void export_(STL& Alist) { //a member function
    for_each(Alist0.begin(), Alist0.end(), //member data
        boost::lambda::if_then(
            boost::lambda::bind(&A::get_StatusTag, boost::lambda::_1) == OK, //some global enum returned by A::get_StatusTag
            boost::lambda::bind(&STL::push_back, Alist, boost::lambda::_1)
        )
    );
}

3 个答案:

答案 0 :(得分:5)

lambda :: bind按副本绑定。表达式bind(&STL::push_back, AList, _1)因此创建了一个包含AList的副本的仿函数。由于这个仿函数的operator()是const,因此应用它会失败,因为它最终会在const对象(其内部副本)上调用非const成员(push_back)。

解决方案:使用以下内容绑定到引用到AList,bind(&STL::push_back, boost::ref(AList), _1)

答案 1 :(得分:1)

作为参考,这是一个更正常的copy_if实现,取自http://www.richelbilderbeek.nl/CppCopy_if.htm

template<typename In, typename Out, typename Pred>
Out copy_if(In first, In last, Out res, Pred Pr)
{
  while (first != last)
  {
    if (Pr(*first))
      *res++ = *first;
    ++first;
  }
  return res;
}

然后你就像使用它一样:

template <typename BackInsertionSequence>
void export_(BackInsertionSequence &Alist) {
    copy_if(AList0.begin(), AList0.end(), std::back_inserter(Alist),
        boost::lambda::bind(&A::get_StatusTag, boost::lambda::_1) == OK
    );
}

当然假设我复制的行不是代码中失败的行。

答案 2 :(得分:0)

我的猜测是编译器不喜欢这行

boost::lambda::bind(&A::get_StatusTag, boost::lambda::_1) == OK

我想知道它是否未能从绑定对象中找到正确的运算符方法而不是_1。你应该尝试将它包装在另一个lambda表达式中。

这样想:

(_1 == OK)(boost::lambda::bind(&A::get_StatusTag, boost::lambda::_1))