假设我们正在开发商店,并且根据会话状态,允许用户执行不同的操作。例如,假设必须在某个特定时刻阻止窗口小部件,因为某些特定用户操作,并且用户再次尝试。
当然,最明显的实现是在相应的函数(特定的事件处理程序)中启动一个异常,说当前阻止了该动作。这类似于我的具体问题。在这种情况下,对我来说更方便,而不是抛出异常,使函数成为" no-op",而是发出boost::signal2
的信号。 GUI执行他想做的任何事情,通知用户或其他任何事情。但也许GUI只想通知用户一次,因此,它只是在第一次调用后断开信号。
我喜欢它。它非常漂亮和优雅:使它成为无操作并发出信号。没有堆栈展开,函数可以标记为noexcept,因此您可以启用更多优化,只有当您需要,连接和断开信号时才能处理异常情况。
现在问题是,如果我想概括用每个异常代替信号的方法怎么办?即使是非GUI应用程序?
在这种情况下,boost::signals2
比例外情况更有效吗?因为它是尝试/捕获块的常见听觉,no-noexcept函数和堆栈展开会导致开销并避免编译器进行大量可能的优化。另一方面,boost::signals2
是线程安全的,这会导致额外的开销。
我的想法是不是一个坏主意?
我希望我的问题并不是因为过于宽泛而且#34;或者"基于意见的",因为它毕竟是设计(和优化)的问题;虽然没有太多具体,但我不得不承认。
注意: GUI是一个网站。问题是,我使用Wt,一个用C ++编写网站的库,它将小部件和信号的层次结构转换为HTML / Javascript / Ajax,我的长期项目是创建一个用于创建GUI的套件。来自具有独特C ++后端的通用基础架构的桌面/移动(Qt)和Web(Javascript)。 Wt允许在同一事件的C ++ / Javascript插槽之间进行映射;例如,单击:如果Javascript或Ajax不可用,则将事件发送到服务器并调用C ++插槽。如果可用,则使用Javascript版本在客户端上执行事件。如果同一个(GUI)事件有多个槽,则槽的执行顺序是未指定的,如果两个槽都是C ++调用,如果有足够的可用线程,它们甚至可以在服务器上并行执行在线程池中。