2009-04-05 6 views
7

Esta pregunta es una cuestión de estilo, ya que siempre puede escribir un bucle for o algo similar; sin embargo, ¿existe un STL o BOOST menos molesto equivalente a la escritura?Función de miembro de llamada en cada elemento en un contenedor

for (container<type>::iterator iter = cointainer.begin(); 
    iter != cointainer.end(); 
    iter++) 
iter->func(); 

?

Algo así como (imaginaria) esto:

call_for_each(container.begin(), container.end(), &Type::func); 

creo que sería 1) escribir menos, 2) fácil de leer, 3) menos cambios Si ha decidido cambiar el tipo de base de tipo/contenedor.

EDIT: Gracias por su ayuda, ahora, ¿y si quisiera pasar algunos argumentos a la función miembro?

Respuesta

4

descubrí que impulso se unen parece ser muy adecuado para la tarea, además de que puede pasar argumentos adicionales para el método:

#include <iostream> 
#include <functional> 
#include <boost/bind.hpp> 
#include <vector> 
#include <algorithm> 

struct Foo { 
    Foo(int value) : value_(value) { 
    } 

    void func(int value) { 
     std::cout << "member = " << value_ << " argument = " << value << std::endl; 
    } 

private: 
    int value_; 
}; 

int main() { 
    std::vector<Foo> foo_vector; 

    for (int i = 0; i < 5; i++) 
     foo_vector.push_back(Foo(i)); 

    std::for_each(foo_vector.begin(), foo_vector.end(), 
     boost::bind(&Foo::func, _1, 1)); 
} 
+0

+1 porque me ganaste 5 minutos con esa respuesta de enlace: p (oh, std :: mem_fun_ref es una porquería cuando se usa con argumentos enlazados!) –

+0

+1, para resolver esto sin ti solo y para usar Boost. ¡Aclamaciones! – dirkgently

+0

lo que quiero decir es cuando tienes referencia-a-referencias cuando tienes la función miembro tiene un parámetro de referencia. boost :: bind lo resuelve muy bien :) –

22
#include <algorithm> // for_each 
#include <functional> // bind 

// ... 

std::for_each(container.begin(), container.end(), 
        std::bind(&Type::func)); 

Ver std::for_each y std::bind documentación para más detalles.

omitido su edición: De todos modos aquí es otra manera de lograr lo que desee sin necesidad de impulso, si alguna vez necesita ser:

std::for_each(foo_vector.begin(), foo_vector.end(), 
    std::bind(&Foo::func, std::placeholders::_1)); 
+0

me ganó por 8 segundos – JaredPar

+0

@ JaredPar/bb : ROFLMAO! – dirkgently

+0

mis 2 centavos por su velocidad :) –

5

Puede utilizar std::for_each o boost's foreach constructs.

Utilice boost BOOST_FOREACH o BOOST_REVERSE_FOREACH cuando no desee mover la lógica a otra función.

+1

+1. BOOST_FOREACH (tipo & t, contenedor) t.func(); se ve bastante limpio –

0

Si realmente desea mejorar el rendimiento en lugar de simplemente actualizar su código, lo que realmente necesita es una función de mapa. Eric Sink escribió un .net implementation

+0

Gracias, estoy buscando una solución genérica de C++ (plataforma independiente). – kyku

Cuestiones relacionadas