gpt4 book ai didi

c++ - C++ 中的 golang 样式 "defer"

转载 作者:IT老高 更新时间:2023-10-28 13:08:55 28 4
gpt4 key购买 nike

我正在阅读有关 go 语言的 defer陈述。它允许您指定函数结束时要执行的操作。例如,如果你有一个文件指针或资源,而不是用每个可能的返回路径编写 free/delete,你只需要指定一次 defer 函数。

看起来类似的东西最终可能会出现在 C++ 中( What is standard defer/finalizer implementation in C++?Will there be standardization of scope guard/scope exit idioms? )在此之前,使用析构函数进行回调的对象有什么不可预见的事情吗?它看起来像 destructor order for local variables is sane并且它也可以很好地处理异常,尽管可能不会退出信号。

这是一个示例实现...有什么问题吗?

#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";});
}

输出:你好,世界!

最佳答案

Boost 在智能指针编程技术中对此进行了讨论:

你可以这样做,例如:

#include <memory>
#include <iostream>
#include <functional>

using namespace std;
using defer = shared_ptr<void>;

int main() {
defer _(nullptr, bind([]{ cout << ", World!"; }));
cout << "Hello";
}

或者,没有绑定(bind):

#include <memory>
#include <iostream>

using namespace std;
using defer = shared_ptr<void>;

int main() {
defer _(nullptr, [](...){ cout << ", World!"; });
cout << "Hello";
}

您也可以为此推出自己的小类,或使用 N3830/P0052 的引用实现:

The C++ Core Guidelines还有have a guideline它使用 gsl::finally 函数,有一个实现 here .

有许多代码库为此采用了类似的解决方案,因此,这个工具有需求。

相关SO讨论:

关于c++ - C++ 中的 golang 样式 "defer",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33050620/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com