/ / Czy bezpiecznie jest używać std :: bind with boost :: signal2? - c ++, boost, bind, sygnały, funkcje składowe

Czy bezpieczne jest używanie std :: bind z boost :: signals2? - c ++, boost, bind, sygnały, funkcje członkowskie

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 № 1

The 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.