2011-10-10 14 views
5

¿Es seguro usar std :: bind para pasar una función miembro para impulsar :: signals2 :: señal :: conectar()? En otras palabras, ¿boost :: bind y std :: bind son intercambiables?¿Es seguro usar std :: bind con boost :: signals2?

Compila con VC++ 2010 SP1, pero el código de la plantilla está muy por encima de mi cabeza y me temo que podría aventurarme en un territorio de comportamiento indefinido.

Respuesta

1

La función connect toma un objeto boost::function, que es básicamente un contenedor genérico en torno nada que tiene un operator() definido para ello. Por lo tanto, es exactamente tan seguro como lo que está vinculando.

Por ejemplo, este es razonablemente segura:

boost::shared_ptr<ClassName> pValue = boost::make_shared<ClassName>(...); 
signal.connect(boost::bind(&ClassName::FuncName, pValue, ...); 

Esta es razonablemente seguro, ya que almacena una boost::shared_ptr como parte de sus datos.

ClassName *pValue = new ClassName(...); 
signal.connect(boost::bind(&ClassName::FuncName, pValue, ...); 

Ésta es condicionalmente seguro. Inmediatamente se vuelve inseguro si esa conexión aún existe y ejecuta delete pValue.

Personalmente, no pongo mucha fe en "condicionalmente seguro", pero eso depende de usted. El punto es que todo lo que enlaza al boost::bind debe continuar existiendo siempre que esté vinculado.

2

No tengo experiencia en el tema por lo que esperaría connect para tomar cualquier cosa que implemente un operador de llamada a función válida. Debería ser seguro llamarlo con cualquier función u objeto de función que coincida con la firma, ya sea boost :: bind, std :: bind o cualquier otra cosa. Las bibliotecas de Boost están diseñadas para ser genéricas, por lo que generalmente no van eligiendo los detalles de implementación de los demás.

Cuestiones relacionadas