2011-09-12 15 views
5

He aquí una idea general de cómo mi clase se define como (que realiza otras operaciones de lo que se menciona más adelante)std :: uso for_each en función miembro con dos argumentos

struct Funktor 
{ 
    Funktor(int val):m_val(val){} 
    bool operator()(int arg1, int arg2) { return m_val==arg1*arg2; } 
    int m_val; 
}; 

y ahora tengo un vector de los objetos anteriores, y estoy tratando de llamar a operator() usando for_each, ¿hay alguna manera de hacer esto? Sé que se puede hacer usando bind2nd y mem_func_ref, pero cuando solo hay un argumento, pero para dos argumentos, no he encontrado la manera.

int main() 
{ 
    std::vector<Funktor> funktors; 
    funktors.push_back(Funktor(10)); 
    funktors.push_back(Funktor(20)); 
    funktors.push_back(Funktor(30)); 

    int arg1 = 5, arg2 = 6; 
    //instead of the for loop below I want to use for_each 
    for(std::vector<Funktor>::iterator itr = funktors.begin(); funktors.end() != itr; ++itr) 
    { 
     (*itr)(arg1,arg2); 
    } 
} 

Gracias por cualquier ayuda. Mejor.

CV

+1

¿Puedes aclarar por qué quieres hacer esto? Parece efectivamente un no-op. –

+0

@Mark: ¿Quiere decir que el operador() no hace nada? Fue solo para dar una idea de la estructura de mi clase. – blueskin

+0

@blueskin: Quiere decir que 'std :: for_each' descarta los resultados del functor, por lo que los 'bool's devueltos nunca se usarán, lo que hace que esta muestra en particular no tenga sentido. – ildjarn

Respuesta

7

C++ 03 Solución (sin refuerzo):

escribir otro funtor como:

struct TwoArgFunctor 
{ 
    int arg1, arg2; 
    TwoArgFunctor(int a, int b) :arg1(a), arg2(b) {} 

    template<typename Functor> 
    bool operator()(Functor fun) 
    { 
     return fun(arg1, arg2); //here you invoke the actual functor! 
    } 
}; 

luego usarlo como:

std::for_each(funktors.begin(),funktors.end(), TwoArgFunctor(arg1,arg2)); 

C++ 11 Solución:

std::for_each(funktors.begin(),funktors.end(), 
         [&] (Funktor f) -> bool { return f(arg1,arg2); }); 
+0

C++ 03 solución funcionaría. Gracias. Además, la sintaxis '[&] (Funktor f) -> bool' parece divertida, ¿puedo preguntar qué significa exactamente? – blueskin

+0

@blueskin: Puede familiarizarse con la sintaxis divertida aquí: http://en.wikipedia.org/wiki/C%2B%2B0x#Lambda_functions_and_expressions – Nawaz

+1

gracias por el enlace Nawaz – blueskin

Cuestiones relacionadas