使用boost :: bind的std :: foreach

时间:2011-05-21 18:23:39

标签: c++ stl boost-bind

这有什么问题:

template <typename T>
std::list<T> & operator+=(std::list<T> & first, std::list<T> const& second)
{
    std::for_each(second.begin(), second.end(), boost::bind(&std::list<T>::push_back, first, _1));

    return first;
}

编译很好,但不起作用。

3 个答案:

答案 0 :(得分:6)

您需要使用boost::ref通过引用传递参数/对象,否则bind会创建内部副本。

std::for_each(
    second.begin(), second.end(),
    boost::bind(&std::list<T>::push_back, boost::ref(first), _1)
);

答案 1 :(得分:6)

请注意,虽然Cat Plus Plus的解决方案适合您,但在C ++ 03中(在即将推出的标准版本中的lambdas出现之前),鼓励使用标准库算法和仿函数的方法。不幸的是,在某些情况下,它们自己会变得非常复杂,但在这种情况下,我认为它们会产生更清晰的代码:

std::copy(second.begin(), second.end(), std::back_inserter(first));

答案 2 :(得分:3)

std::list<T> ls;
std::list<T> ls0;
// ...
ls.insert(ls.end(), ls0.begin(), ls0.end());