Cómo usar boost bind con una función miembro


77

El siguiente código hace que cl.exe se bloquee (MS VS2005).
Estoy tratando de usar boost bind para crear una función para llamar a un método de myclass:

#include "stdafx.h"
#include <boost/function.hpp>
#include <boost/bind.hpp>
#include <functional>

class myclass {
public:
    void fun1()       { printf("fun1()\n");      }
    void fun2(int i)  { printf("fun2(%d)\n", i); }

    void testit() {
        boost::function<void ()>    f1( boost::bind( &myclass::fun1, this ) );
        boost::function<void (int)> f2( boost::bind( &myclass::fun2, this ) ); //fails

        f1();
        f2(111);
    }
};

int main(int argc, char* argv[]) {
    myclass mc;
    mc.testit();
    return 0;
}

¿Qué estoy haciendo mal?

Respuestas:


106

Utilice lo siguiente en su lugar:

boost::function<void (int)> f2( boost::bind( &myclass::fun2, this, _1 ) );

Esto reenvía el primer parámetro pasado al objeto de la función a la función usando marcadores de posición; debe decirle a Boost.Bind cómo manejar los parámetros. Con su expresión, intentaría interpretarla como una función miembro sin argumentos.
Consulte, por ejemplo, aquí o aquí para conocer los patrones de uso comunes.

Tenga en cuenta que VC8s cl.exe se bloquea regularmente en los usos indebidos de Boost.Bind ; en caso de duda, use un caso de prueba con gcc y probablemente obtendrá buenas pistas como los parámetros de plantilla con los que se crearon instancias de Bind -internals si lee la salida.


¿Alguna posibilidad de que pueda ayudar con este stackoverflow.com/questions/13074756/… ? es similar pero std::functionda un error
kirill_igum

Gracias, esto es algo confuso, ¡pero tu respuesta me salvó el tocino!
portforwardpodcast
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.