2012-05-09 7 views
5

Supongamos que hay un vector de objetos de clase.Llamar a una función miembro de cada elemento de un vector C++

vector<Object1> vec; 

Say, Object1 tiene una función miembro void foo(Object2*).

Quiero hacer lo siguiente:

for(int i=0; i<vec.size(); i++) { 
    vec[i].foo(obj2); 
} 

¿Cómo se puede hacer esto sin necesidad de utilizar un bucle explícito?

+3

¿Qué hay de malo con el uso de un bucle? – giorashc

+2

@giorashc, siempre prefiere un algoritmo sobre un bucle. Aunque, hay basado en rangos por ahora. – chris

+1

@giorashc Nada mal. Al igual que hay 'for_each' para aplicar la función en los elementos de un vector, quería saber si hay alguna forma de llamar a una función miembro para cada elemento de un vector. – vikaspraj

Respuesta

6

más fácil con TR1/C++ 11:

#include <vector> 
#include <functional> 
#include <algorithm> 

struct Object2{}; 

struct Object1 { 
    void foo(Object2*) {} 
}; 

int main() { 
    std::vector<Object1> vec; 
    Object2 obj2; 
    std::for_each(vec.begin(), vec.end(), std::bind(&Object1::foo, std::placeholders::_1, &obj2)); 
} 

Pero también se puede utilizar std::for_each con std::bind2nd y std::mem_fun_ref si eso no es una opción:

std::for_each(vec.begin(), vec.end(), std::bind2nd(std::mem_fun_ref(&Object1::foo), &obj2)); 
+0

¿No se cuenta para cada recorrido como un bucle? –

+2

No es un bucle ** explícito ** :) –

+1

@LuchianGrigore, es un algoritmo, que debería preferirse en lugar de un bucle simple. – chris

0

Un estilo antiguo es manualmente escribe un functor. Para una lógica más compleja, esto te permite dedicar una clase completa al problema.

class fancyFunctor 
{ 
    Object2* m_data; 

public: 
    fancyFunctor(Object2 * data) : m_data(data){} 

    operator()(Object1 & ref) 
    { 
    ref.foo(m_data) 
    } 
} 

Luego de iteratate:

std::for_each(vec.begin(),vec.end(), fancyFunctor(&randomObject2)); 
-1

legibilidad de tal código no es perfecto, y no se puede hacer de cualquier manera sencilla de una sola línea. Es porque, el primer argumento del método miembro de alguna clase es el puntero al objeto de esta clase, en el que se realizará.

Alternativamente, puede utilizar el bucle foreach que viene con el nuevo estándar C++ 11 (pero sigue siendo el bucle).

+0

Notarás que mi respuesta tiene una sola línea simple para C++ 11 y C++ 98/03, a pesar del puntero. – Flexo

+0

Sí, tienes razón, mi mal. No tomé en consideración el enlace C++ 11/tr1 (al principio debería haber leído toda su publicación). – gal

Cuestiones relacionadas