2011-10-10 8 views
5

È sicuro utilizzare std :: bind per passare una funzione membro per potenziare :: signals2 :: signal :: connect()? In altre parole, è boost :: bind e std :: bind intercambiabile?È sicuro usare std :: bind con boost :: signals2?

Si compila con VC++ 2010 SP1, ma il codice di modello è molto oltre la mia testa e temo che potrei avventurarmi in un territorio di comportamento non definito.

risposta

1

La funzione connect prende un oggetto boost::function, che è sostanzialmente un involucro generico intorno nulla che ha un operator() definito per esso. Pertanto è esattamente sicuro quanto ciò che sei vincolante.

Ad esempio, questo è ragionevolmente sicuro:

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

Questa è ragionevolmente sicuro perché memorizza un boost::shared_ptr come parte dei suoi dati.

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

Questo è condizionatamente sicura. Diventa immediatamente pericoloso se la connessione esiste ancora ed è possibile eseguire delete pValue.

Personalmente, non ripongo molta fiducia in "condizioni di sicurezza", ma dipende da voi. Il punto è che tutto ciò che si lega a boost::bind deve continuare ad esistere finché è legato.

2

Non sono esperto nell'argomento, mi aspetto che lo connect esegua tutto ciò che implementa un operatore di chiamata di funzione valido. Dovrebbe essere sicuro chiamarlo con qualsiasi funzione o oggetto funzione che corrisponde alla firma, sia boost :: bind, std :: bind o qualsiasi altra cosa. Le librerie Boost sono progettate per essere generiche, quindi di solito non scelgono i rispettivi dettagli di implementazione.