【发布时间】:2013-06-07 21:33:12
【问题描述】:
是否有某种方法可以覆盖在 boost::signals2 中调用插槽并执行某些操作(记录、调试、异常处理)的特定时刻?
我想在插槽调用时捕获异常,因为信号/插槽是我的代码中的执行路径在各种软件组件之间交叉的地方,并且每个组件都是可选的/可以在运行时禁用,如果它行为不端。因此,当插槽调用抛出(可能来自外部库,可能只是 std::bad_alloc)时,我希望收到有关它的通知 - 并知道哪个组件被发送到 - 所以我可以杀死那个组件。
我不知道如何在组合器中执行此操作,因为我无法访问那里的插槽或连接对象?所以我看不到获取任何信息的方法。 (改变每个槽的返回类型是不可行的。)
有没有一些我错过的超级简单的方法?
如果没有,我该怎么办?
像 slot_call_iterator(在 try/catch 中包装调用)和 connection_body_base(例如存储有关它所属的组件的信息)之类的子类,并让 boost 使用这些? (如何?)
或子类signals2::slot<...>,在构造函数中给它有关拥有组件的信息并以某种方式重载operator()(...)? (对此也不知道,使用所有模板魔法似乎要困难得多。)
【问题讨论】:
-
这样的功能好像不存在,但是可以在trac中添加功能请求(甚至提供补丁)。
-
感谢您的评论。是的,我认为它不存在,只是想知道是否有办法对公开导出的 boost 类进行子类化或覆盖以制作我自己的类。盲目地尝试使用 boost 代码执行此操作可能会令人生畏,因为我担心这样做可能会破坏或滥用内部结构。
标签: c++ boost boost-signals2