Czy bezpiecznie jest używać std :: bind do przekazania funkcji członka w celu zwiększenia :: signal2 :: signal :: connect ()? Innymi słowy, czy boost :: bind i std :: bind są wymienne?
Kompiluje się z VC ++ 2010 SP1, ale kod szablonu jest ponad moją głową i obawiam się, że mógłbym zapuszczać się na terytorium o nieokreślonym zachowaniu.
Odpowiedzi:
1 dla odpowiedzi № 1The connect
funkcja wymaga boost::function
obiekt, który jest zasadniczo ogólnym opakowaniem byle co który ma operator()
zdefiniowane dla tego. Dlatego jest to tak samo bezpieczne, jak to, co wiążą.
Na przykład jest to dość bezpieczne:
boost::shared_ptr<ClassName> pValue = boost::make_shared<ClassName>(...);
signal.connect(boost::bind(&ClassName::FuncName, pValue, ...);
Jest to dość bezpieczne, ponieważ przechowuje boost::shared_ptr
jako część jego danych.
ClassName *pValue = new ClassName(...);
signal.connect(boost::bind(&ClassName::FuncName, pValue, ...);
To jest warunkowo bezpieczny. Natychmiast staje się niebezpieczne, jeśli połączenie nadal istnieje i wykonasz połączenie delete pValue
.
Osobiście nie wierzę w „warunkowo bezpieczny”, ale to zależy od ciebie. Chodzi o to, że wszystko, co wiążesz boost::bind
musi istnieć tak długo, jak jest związany.
2 dla odpowiedzi nr 2
Nie spodziewałbym się, że nie mam doświadczenia w tym temacie connect
wziąć wszystko, co implementuje poprawną funkcjęzadzwoń do operatora. Powinno być bezpiecznie wywoływać go z dowolną funkcją lub obiektem funkcji, który pasuje do podpisu, czy to boost :: bind, std :: bind czy cokolwiek innego. Biblioteki rozszerzeń są zaprojektowane tak, aby były ogólne, więc zwykle nie wybierają sobie nawzajem szczegółów implementacji.