2009-06-15 19 views
15

Considere el siguiente ejemplo.boost :: vinculación y función de miembro de clase

#include <iostream> 
#include <algorithm> 
#include <vector> 

#include <boost/bind.hpp> 

void 
func(int e, int x) { 
    std::cerr << "x is " << x << std::endl; 
    std::cerr << "e is " << e << std::endl; 
} 

struct foo { 
    std::vector<int> v; 

    void calc(int x) { 
     std::for_each(v.begin(), v.end(), 
      boost::bind(func, _1, x)); 
    } 

    void func2(int e, int x) { 
     std::cerr << "x is " << x << std::endl; 
     std::cerr << "e is " << e << std::endl; 
    } 

}; 

int 
main() 
{ 
    foo f; 

    f.v.push_back(1); 
    f.v.push_back(2); 
    f.v.push_back(3); 
    f.v.push_back(4); 

    f.calc(1); 

    return 0; 
} 

Todo funciona bien si uso func() función. Pero en la aplicación de la vida real tengo que usar la función de miembro de la clase, es decir, foo::func2() en este ejemplo. ¿Cómo puedo hacer esto con boost :: bind?

Respuesta

18

Eras muy, muy cerca:

void calc(int x) { 
    std::for_each(v.begin(), v.end(), 
     boost::bind(&foo::func2, this, _1, x)); 
} 

EDIT: Vaya, yo también je.

Aunque, en la reflexión, no hay nada realmente malo con su primer ejemplo de trabajo. En lo posible, debería favorecer las funciones gratuitas sobre las funciones miembro, puede ver la mayor simplicidad en su versión.

+0

Se supone que esto funciona con boost :: lamba :: bind. No usé boost :: bind mucho. –

1

Al usar boost :: bind para las funciones de miembro de la clase de enlace, el segundo argumento debe proporcionar el contexto del objeto. Por lo tanto, su código funcionará cuando el segundo argumento sea this

Cuestiones relacionadas