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