开发者

Is it safe to use std::bind with boost::signals2?

Is it safe to use std::bind to pass a member function to boost::signals2::signal::connect()? In other words, is boost::bind and std::bind interchangeable?

It compiles with VC++ 2010 SP1, but the template code is way over my head开发者_如何转开发 and I'm afraid I might be venturing into undefined behaviour territory.


I'm not experienced in the subject by I would expect connect to take anything that implements a valid function call operator. It should be safe to call it with any function or function object that matches the signature, be it boost::bind, std::bind or anything else. Boost libraries are designed to be generic, so they usually don't go picking each others implementation details.


The connect function takes a boost::function object, which is basically a generic wrapper around anything that has an operator() defined for it. Therefore it is exactly as safe as what you are binding.

For example, this is reasonably safe:

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

This is reasonably safe because it stores a boost::shared_ptr as part of its data.

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

This is conditionally safe. It instantly becomes unsafe if that connection still exists and you execute delete pValue.

Personally, I don't put much faith in "conditionally safe", but that's up to you. The point being that everything you bind to boost::bind must continue to exist so long as it is bound.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜