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?

hamishmcn
fuente

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.

Georg Fritzsche
fuente
¿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