std::for_each, llamando a la función miembro con parámetro de referencia
-
10-07-2019 - |
Pregunta
Tengo un contenedor de punteros sobre los que quiero iterar, llamando a una función miembro que tiene un parámetro que es una referencia.¿Cómo hago esto con STL?
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 pregunta relacionada (de la que derivé mi solución actual) es boost::bind con funciones que tienen parámetros que son referencias.Esto pregunta específicamente cómo hacer esto con impulso.pregunto como se haría sin aumentar.
Editar:Hay una manera de hacer lo mismo sin usar ningún boost
.Mediante el uso std::bind
y amigos, el mismo código se puede escribir y compilar en un compilador compatible con C++ 11 como este:
std::for_each(
sprites.begin(),
sprites.end(),
std::bind(&Renderable::render, std::placeholders::_1, std::ref(g))
);
Solución
Este es un problema con el diseño de <functional>
. Tienes que usar boost :: bind o tr1 :: bind.
Otros consejos
Vea Cómo usar std :: foreach con parámetros / modificación . La pregunta muestra cómo hacerlo usando un bucle for. La respuesta aceptada da un ejemplo de cómo lograr esto con el algoritmo for_each.