C++有没有办法抛出一个'event',它会像异常一样'bubble'堆栈?

In C++ is there any way to throw an 'event' which would 'bubble' up the stack like an exception?

本文关键字:异常 bubble 堆栈 一样 有没有 一个 event C++      更新时间:2023-10-16

我正在制作一个MVC应用程序,我想要的是某种方式来触发某种信号或事件,将其"冒泡"到更高级别的视图类,并进行处理。这种"冒泡"和处理的行为与异常的抛出和捕获完全相同,只是当事件像异常一样被"抛出"时,执行显然不会停止。

C++中存在这样的东西吗?

我的基本原理是,较低级别的模型类不需要了解任何关于视图的信息就可以工作。我不想在任何地方都向视图传递函数/对象指针。

编辑:我可能应该补充一点,我的应用程序使用标准C++,所以目前还没有QT,尽管我可能会尝试将其链接到QT GUI。将QT特定代码与标准C++一起包含在模型类中是否明智。

您要查找的是可重启的异常。这些并没有在C++中实现。在C++中,对异常处理程序的搜索在搜索时执行展开,因此当找到处理程序时,该处理程序和抛出站点之间的所有信息都已被丢弃,因此无法返回到抛出站点。

Common Lisp有可重启的异常(它们被称为条件,而不是被"抛出",而是被"发出信号")。当一个条件被发出信号时,就会通过处理程序的动态上下文进行搜索。处理程序是使用类型层次结构来识别的,这与C++和其他语言非常相似。但此时并没有解除。条件处理程序(由它们自己或与重新启动处理程序协作)决定执行将在哪里继续。这是非常有用的,因为它允许较低级别的代码从情况中恢复,而不需要采取单方面的步骤,而是在较高级别代码的指导下。我可以看到它在模型-视图-控制器框架中是多么有用。

由于C++11具有本地匿名函数,也许类似这样的函数可以组合在一起。虽然这些不是真正的词法闭包(它们只是"向下的funarg"),但这就是所需要的,因为处理程序只需要向下传递,就可以被较低级别的函数调用,而不必返回。