2009-03-12 1 views
8

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

Мое текущее решение - использовать 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 with functions that have parameters that are references. Это специально спросит, как это сделать с повышением. Я спрашиваю, как это будет сделано без boost.

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

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

boost :: bind (& Renderable :: render, _1, boost :: ref (g)), вероятно, должен быть boost :: bind (& Renderable :: render, boost :: ref (g), _1) – Carl

+0

@ carleeto Хорошо поймать. Исправлено через 4 года неправильного! –

ответ

5

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

+0

yep, к сожалению :(Дополнительная информация об этом: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2000/n1245.ps и http://www.open-std.org /jtc1/sc22/wg21/docs/cwg_defects.html#106, который, по-видимому, никогда не попадал в стандарт, но он находится в следующем :) –

+0

Да, проблемы с ссылками на ссылки были именно моей проблемой. Спасибо за информацию! –

3

Заканчивать How to use std::foreach with parameters/modification. Вопрос показывает, как это сделать, используя цикл for. Принятый ответ дает пример того, как добиться этого с помощью алгоритма for_each.