std :: for_each, вызывающая функцию-член со ссылочным параметром - PullRequest
8 голосов
/ 12 марта 2009

У меня есть контейнер указателей, который я хочу перебрать, вызывая функцию-член, у которой есть параметр, который является ссылкой. Как мне это сделать с STL?

Мое текущее решение - использовать для параметра boost :: bind и boost :: ref.

// Given:
// void Renderable::render(Graphics& g)
//
// There is a reference, g, in scope with the call to std::for_each
//
std::for_each(
  sprites.begin(),
  sprites.end(),
  boost::bind(&Renderable::render, boost::ref(g), _1)
);

Смежный вопрос (из которого я получил свое текущее решение): boost :: bind с функциями, параметры которых являются ссылками . Это конкретно спрашивает, как сделать это с наддувом. Я спрашиваю, как это будет сделано без повышения.

Редактировать : Есть способ сделать то же самое, не используя boost. Используя std::bind и друзей, один и тот же код можно написать и скомпилировать в C ++ 11-совместимый компилятор, например:

std::for_each(
  sprites.begin(),
  sprites.end(),
  std::bind(&Renderable::render, std::placeholders::_1, std::ref(g))
);

Ответы [ 2 ]

5 голосов
/ 12 марта 2009

Это проблема с дизайном <functional>. Вы должны использовать boost :: bind или tr1 :: bind.

3 голосов
/ 12 марта 2009

Ознакомьтесь с Как использовать std :: foreach с параметрами / модификацией . Вопрос показывает, как это сделать, используя цикл for. Принятый ответ дает пример того, как этого добиться с помощью алгоритма for_each.

...