对于copy_if,boost :: lambda :: if_then

SYK*_*SYK 1 c++ lambda boost 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)
        )
    );
}
Run Code Online (Sandbox Code Playgroud)

Éri*_*ant 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)