Безопасно ли использовать std :: bind с boost :: signal2? - PullRequest
6 голосов
/ 10 октября 2011

Безопасно ли использовать std :: bind для передачи функции-члена boost :: signal2 :: signal :: connect ()? Другими словами, взаимозаменяемы ли boost :: bind и std :: bind?

Он компилируется с VC ++ 2010 с пакетом обновления 1 (SP1), но шаблон кода у меня над головой, и я боюсь, что могу рискнуть попасть в неопределенную область поведения.

Ответы [ 2 ]

2 голосов
/ 10 октября 2011

Я не обладаю достаточным опытом в этом вопросе, так как я ожидал бы, что connect примет все, что реализует допустимый оператор вызова функции.Должно быть безопасно вызывать его с любой функцией или объектом функции, который соответствует сигнатуре, будь то boost :: bind, std :: bind или что-либо еще.Библиотеки Boost спроектированы так, чтобы быть общими, поэтому они обычно не выбирают детали реализации друг друга.

1 голос
/ 10 октября 2011

Функция connect принимает объект boost::function, который по сути является универсальной оболочкой для всего , для которого определено operator(). Поэтому это так же безопасно, как и то, что вы связываете.

Например, это достаточно безопасно:

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

Это достаточно безопасно, поскольку он хранит boost::shared_ptr как часть своих данных.

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

Это условно безопасно. Мгновенно становится небезопасным, если это соединение все еще существует, и вы выполняете delete pValue.

Лично я не очень верю в "условно-безопасный", но это зависит от вас. Суть в том, что все, что вы связываете с boost::bind, должно продолжать существовать, пока оно связано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...