2009-03-12 21 views
8

Tengo un contenedor de punteros sobre el que quiero iterar, llamando a una función miembro que tiene un parámetro que es una referencia. ¿Cómo hago esto con STL?std :: for_each, función de miembro llamante con el parámetro de referencia

Mi solución actual es usar boost :: bind, y boost :: ref para el parámetro.

// 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) 
); 

Una cuestión relacionada (de la que Derivé mi solución actual desde) es boost::bind with functions that have parameters that are references. Esto específicamente pregunta cómo hacer esto con impulso. Me pregunto cómo se haría sin impulso.

Editar: Hay una manera de hacer lo mismo sin usar ningún boost. Mediante el uso de std::bind y amigos el mismo código puede ser escrito y compilado en un compilador compatible con 11 C++ así:

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)) probablemente debería ser boost :: bind (& Renderable :: render, boost :: ref (g), _1) – Carl

+0

@carleeto Bueno captura. ¡Reparado después de 4 años de estar equivocado! –

Respuesta

5

Esto es un problema con el diseño de <functional>. O bien tienes que usar boost :: bind o tr1 :: bind.

+0

sí, tristemente :(más información sobre esto: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2000/n1245.ps y http://www.open-std.org /jtc1/sc22/wg21/docs/cwg_defects.html#106 que aparentemente nunca llegó al estándar. Pero está en el siguiente :) –

+0

Sí, el problema de referencias a referencias fue exactamente mi problema. Gracias por la info! –

Cuestiones relacionadas