Tôi đã đọc về tuyên bố của defer ngôn ngữ đi. Nó cho phép bạn chỉ định một hành động cần thực hiện khi một hàm kết thúc. Ví dụ, nếu bạn có một con trỏ tập tin hoặc tài nguyên, thay vì viết miễn phí/xóa với mọi đường dẫn trả về có thể, bạn chỉ cần xác định chức năng trì hoãn một lần.phong cách golang "trì hoãn" trong C++
Dường như một sự tương tự có thể đến với C++ sau cùng (What is standard defer/finalizer implementation in C++?, Will there be standardization of scope guard/scope exit idioms?) Cho đến lúc đó, có bất kỳ điều gì không lường trước được về việc thực hiện nó với một đối tượng có destructor gọi lại không? Nó trông giống như destructor order for local variables is sane và nó cũng xử lý ngoại lệ tốt, mặc dù có thể không xuất hiện trên các tín hiệu.
Dưới đây là triển khai mẫu ... có sự cố gì về nó không?
#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";});
}
Output: Hello, world!
Điều này có thể thích hợp hơn cho [CodeReview] (http://codereview.stackexchange.com). Lưu ý rằng đã có nhiều triển khai của lớp giống như ScopeGuard này, vậy tại sao lại phát minh ra bánh xe? Một số triển khai mà tôi biết có nhiều lợi ích hoặc công cụ chuyên biệt mà tôi muốn sử dụng cho phiên bản của bạn (ví dụ: không xóa được loại). – dyp
Vấn đề với điều này là mỗi lớp nên đã làm những gì bạn đang làm trong destructor của họ để các trường hợp sử dụng trong C + + là cách hiếm hơn trong Go. Nếu bạn đang tìm kiếm hiện thực hiện kiểm tra boost.ScopeExit. Facebook của Folly có một cũng như tôi nghĩ. – inf
Có lẽ bạn nên đánh dấu phần phá hủy 'noexcept'. Nếu hàm bạn sử dụng 'FrameExitTask' trả về bình thường, một ngoại lệ từ trình xử lý cuối cùng của bạn có thể sẽ hoạt động. Nếu hàm này thoát do một số ngoại lệ khác, thì ngoại lệ thứ hai từ trình xử lý của bạn sẽ gây ra sự cố. –