std :: foreach с boost :: bind - PullRequest
       40

std :: foreach с boost :: bind

3 голосов
/ 21 мая 2011

Что не так с этим:

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 ]

6 голосов
/ 21 мая 2011

Обратите внимание, что, хотя решение Cat Plus Plus будет работать для вас, рекомендуемый способ сделать такие вещи в C ++ 03 (до появления лямбд в будущей стандартной версии) состоит в использовании стандартных библиотечных алгоритмов и функторов.К сожалению, в некоторых случаях они становятся довольно запутанными, но в этом случае я думаю, что они производят более четкий код:

std::copy(second.begin(), second.end(), std::back_inserter(first));
6 голосов
/ 21 мая 2011

Вам необходимо использовать boost::ref для передачи аргумента / объекта через ссылку, в противном случае bind создаст внутреннюю копию.

std::for_each(
    second.begin(), second.end(),
    boost::bind(&std::list<T>::push_back, boost::ref(first), _1)
);
3 голосов
/ 21 мая 2011
std::list<T> ls;
std::list<T> ls0;
// ...
ls.insert(ls.end(), ls0.begin(), ls0.end());
...