我一直试图通过以下代码模拟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)
)
);
}
答案 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))