当前位置: 首页 > 面试题库 >

C ++中的golang风格的“延迟” [重复]

郁高韵
2023-03-14
问题内容

我正在阅读有关go语言的延期声明。它允许您指定函数结束后要执行的操作。例如,如果您有文件指针或资源,而不是使用每个可能的返回路径编写自由/删除,则只需指定一次defer函数。

它看起来像一个模拟可能会转到C 最终(什么是C标准延迟/终结执行
,会不会有范围后卫/范围退出成语?标准化在此之前,有什么意外讲的是一个对象,它这样做析构函数进行回调?看起来局部变量的析构函数顺序是理智的,并且它也可以很好地处理异常,尽管可能不会在信号上退出。

这是一个示例实现…对此有什么麻烦吗?

#include <iostream>
#include <functional>
using namespace std;

class FrameExitTask {
    std::function<void()> func_;
public:
    FrameExitTask(std::function<void()> func) :
    func_(func) {
    }
    ~FrameExitTask() {
        func_();
    }
    FrameExitTask& operator=(const FrameExitTask&) = delete;
    FrameExitTask(const FrameExitTask&) = delete;
};

int main() {
    FrameExitTask outer_task([](){cout << "world!";});
    FrameExitTask inner_task([](){cout << "Hello, ";});
    if (1+1 == 2)
        return -1;
    FrameExitTask skipped_task([](){cout << "Blam";});
}

输出: Hello, world!


问题答案:

这已经存在,它被称为范围卫士。观看这个精彩的演讲:https :
//channel9.msdn.com/Shows/Going+Deep/C-and-Beyond-2012-Andrei-Alexandrescu-
Systematic-Error-Handling-
in-C
。这使您可以轻松创建要在退出时调用的任意可调用对象。这是较新的版本;它最初是在很久以前就开发出来的。

通常它可以完美运行,但是我不确定您处理异常的含义。从必须在范围出口处调用的函数引发异常是一团糟。原因:当引发异常(而不是立即捕获)时,当前作用域退出。所有析构函数都将运行,并且异常将继续传播。如果其中一个破坏者抛出,该怎么办?您现在有两个实时例外。

我想一种语言可以尝试解决这个问题,但这很复杂。在C ++中,很少将抛出析构函数视为好主意。



 类似资料:
  • 问题内容: 关于延期,Effective Go 声明以下内容: 延迟函数(如果函数是方法,则包括接收方)的参数在 延迟 执行时而不是在 调用 执行时进行评估。除了避免担心函数执行时变量会更改值外,这还意味着单个延迟的调用站点可以延迟多个函数的执行。这是一个愚蠢的例子。 延迟函数以LIFO顺序执行,因此该函数返回时将导致打印此代码。 这个例子使我感到困惑。如果在执行defer调用时评估了参数,则应该

  • 问题内容: 更改了该方法的结构后,当defer调用两次时会发生什么? 例如: 其中当最后叫什么名字? 问题答案: 它取决于方法的接收者 和 变量的类型。 简短的答案:如果您使用的是包,则延迟的方法将正确关闭两个实例,因为它们具有 指针 接收器, 并且 由于返回了 指针 ( 指针 也是如此)。请参阅下面的推理和解释。 为避免混淆,我建议使用不同的变量,这样会清楚您 想要 什么以及 将要 关闭的内容:

  • Go 语言中没有提供其它面向对象语言的析构函数,但是 Go 语言提供了 defer 语句用于实现其它面向对象语言析构函数的功能 defer 语句常用于 释放资源、解除锁定 以及 错误处理 等 例如C语言中我们申请了一块内存空间,那么不使用时我们就必须释放这块存储空间 例如C语言中我们打开了一个文件,那么我们不使用时就要关闭这个文件 例如C语言中我们打开了一个数据库, 那么我们不使用时就要关闭这个数

  • 我试图将paralleStream与自定义的ForkJoin池一起使用,该任务执行网络调用。当我使用以下样式时 如果使用parallelStream,那么ForkJoinPool.Common是否以某种方式参与其中?下面是模拟上述两种样式的整个程序

  • 问题内容: 标题几乎总结了一下。 外部样式表具有以下代码: 我尝试使用: 和 但都行不通。是否有可能使用javascript覆盖!important样式。 如果有区别的话,这是给 greasemonkey扩展的。 问题答案: 我相信这样做的唯一方法是将样式添加为带有’!important’后缀的新CSS声明。最简单的方法是将新的元素附加到文档的开头: 使用上述方法添加的规则(如果使用!import

  • 本文向大家介绍C#中Linq延迟查询的例子,包括了C#中Linq延迟查询的例子的使用技巧和注意事项,需要的朋友参考一下 提出问题 下面所给代码编译时正常,但是执行时会出错,请指出程序在执行时能够执行到编号为(1)(2)(3)的代码行中的哪一行。 问题分析 其实,发现问题并不难,很显然在执行代码“it => it.Name.Trim()”时会出错,因为集合studentList中第二个学生的Name