Frage Ist es sicher, std :: bind mit boost :: signals2 zu verwenden?


Ist es sicher, std :: bind zu verwenden, um eine Memberfunktion an boost :: signals2 :: signal :: connect () zu übergeben? Mit anderen Worten, ist boost :: bind und std :: bind austauschbar?

Es kompiliert mit VC ++ 2010 SP1, aber der Template-Code ist weit über meinem Kopf und ich fürchte, ich könnte mich auf ein undefiniertes Verhaltensgebiet wagen.


5
2017-10-10 07:12


Ursprung


Antworten:


Das connect Funktion dauert a boost::function Objekt, das im Grunde ein generischer Wrapper ist etwas das hat ein operator() dafür definiert. Daher ist es genau so sicher wie das, was Sie binden.

Zum Beispiel ist das einigermaßen sicher:

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

Dies ist einigermaßen sicher, weil es speichert boost::shared_ptr als Teil seiner Daten.

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

Das ist bedingt sicher. Es wird sofort unsicher, wenn diese Verbindung noch besteht und Sie ausführen delete pValue.

Persönlich glaube ich nicht an "bedingt sicher", aber das liegt an dir. Der Punkt ist, dass alles, was Sie binden boost::bind muss bestehen bleiben, solange es gebunden ist.


1
2017-10-10 07:50



Ich bin nicht in dem Thema erfahren, von dem ich erwarten würde connect alles, was einen gültigen Funktionsaufrufoperator implementiert. Es sollte sicher sein, es mit einer Funktion oder einem Funktionsobjekt aufzurufen, die der Signatur entsprechen, sei es boost :: bind, std :: bind oder irgendetwas anderes. Boost-Bibliotheken sind so konzipiert, dass sie generisch sind, sodass sie sich normalerweise nicht gegenseitig die Implementierungsdetails aussuchen.


2
2017-10-10 07:24