不包括 boost 信号调用
有一个信号和几个带槽的对象。我想实现当一个对象调用信号并阻止其自己的连接时的行为。我想一个小片段会提供更多信息:
typedef boost::signal<void()> TSignal;
template<class TSignal>
class SlotObject
{
public:
void Connect(boost::shared_ptr<TSignal> pSignal, boost::function slot)
{
m_connection = pSignal->connect(slot);
m_pSignal = pSignal;
}
// How to define TSignal signature here?
VOID Call()
{
m_connection.block();
(*m_pSignal)();
m_connection.unblock();
}
boost::shared_ptr<TSignal> m_pSignal;
boost::signals::connection m_connection;
};
问题:
- 是否有一些增强内容的标准方法?我要重新发明轮子吗?
- 如何使用 TSignal 签名定义 Call 方法?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
对于你的第一个问题:我不知道有“标准提升方式”来实现你想要的。您可以将问题发布到 Boost 用户邮件列表。
对于第二个问题:如果没有可变模板和右值引用,转发总是很麻烦。
一些建议,排名不分先后:
1) 您可以查看 boost/signal.hpp 和 boost/signals/ 中的文件,以了解如何完成此类工作预处理器,但这里有一个部分实现来展示这个想法(警告:未经测试):
2) 如果您愿意为 SlotObject 的用户放弃一些语法细节,其他事情也是可能的。一种是使用 boost::shared_ptr 文档中显示的技术包装对信号的调用(http://www.boost.org/doc/libs/1_40_0/libs/smart_ptr/sp_techniques.html#wrapper),即您的 Call() 方法将阻止 m_connection ,并将一个shared_ptr返回给m_signal,该m_signal具有一个可以解除m_connection阻塞的自定义删除器。
遗憾的是,这并没有为调用者提供良好的语法。它看起来像:
3) 另一种选择是要求用户将参数打包在一个元组中(我使用的是 boost::fusion::vector 在调用站点,并使用 boost::fusion:: :fused 解压它们并调用信号。
这将用作:
For your first question: I'm not aware of a "standard boost way" to achieve what you want. You may post your question to the boost users mailing list.
For your second question: Without varidic templates and rvalue references, forwarding is always cumbersome.
A few suggestions, in no particular order:
1) You may look at the boost/signal.hpp and the files in boost/signals/ to get an idea of how this kind of stuff can be done with the preprocessor, but here's a partial implementation to show the idea(warning: untested):
2) If you are willing to give up a bit of syntax nicety for the users of SlotObject, other things are possible. One is to wrap the call to the signal using the technique shown in boost::shared_ptr documentation (http://www.boost.org/doc/libs/1_40_0/libs/smart_ptr/sp_techniques.html#wrapper), ie, your Call() method would block the m_connection, and return a shared_ptr to m_signal having a custom deleter that unblocks m_connection.
Sadly, this does not give a nice syntax to the caller. It would look like:
3) Another alternative is to ask the user to package the arguments in a tuple (I'm using a boost::fusion::vector below) at the call site, and use boost::fusion:::fused to unpack them and call the signal.
This would be used as: