亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

C ++中的golang樣式“延遲”

C ++中的golang樣式“延遲”

Go
烙印99 2021-11-15 15:50:04
我正在閱讀 go 語言的defer語句。它允許您指定在函數結束時要采取的操作。例如,如果您有一個文件指針或資源,則無需使用每個可能的返回路徑編寫 free/delete,您只需指定一次 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!
查看完整描述

3 回答

?
呼喚遠方

TA貢獻1856條經驗 獲得超11個贊

Boost 在 Smart Pointer Programming Techniques 中對此進行了討論:


http://www.boost.org/doc/libs/1_59_0/libs/smart_ptr/sp_techniques.html#handle

你可以這樣做,例如:


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

}


查看完整回答
反對 回復 2021-11-15
?
暮色呼如

TA貢獻1853條經驗 獲得超9個贊

這已經存在,它被稱為范圍保護??吹竭@個精彩的演講:https : //channel9.msdn.com/Shows/Going+Deep/C-and-Beyond-2012-Andrei-Alexandrescu-Systematic-Error-Handling-in-C。這使您可以輕松創建要在退出時調用的任意可調用對象。這是較新的版本;它最初是在 go 出現之前很久就被開發出來的。

它在一般情況下完美運行,但我不確定你所說的處理異常是什么意思。從必須在作用域退出時調用的函數拋出異常是一團糟。原因:當拋出異常(而不是立即捕獲)時,當前作用域退出。所有析構函數都會運行,異常將繼續傳播。如果其中一個析構函數拋出異常,你會怎么做?您現在有兩個實時異常。

我想有一種語言可以嘗試處理這個問題,但它非常復雜。在 C++ 中,拋出析構函數被認為是一個好主意是非常罕見的。


查看完整回答
反對 回復 2021-11-15
?
有只小跳蛙

TA貢獻1824條經驗 獲得超8個贊

這在 C++ 中已經存在,這是一個非常糟糕的主意,你給出的例子說明了為什么這是一件毫無意義的事情,我希望委員會永遠不會引入它。

例如,如果您有一個文件句柄,然后編寫一個類來為您完成它,然后您就不必為每個用例編寫 defer 語句,而您很容易忘記這樣做?;蛘咧皇呛唵蔚嘏e了。你寫一個析構函數,一次。就是這樣。然后,您可以保證該類的所有用途都是安全的。它更安全,更容易。


查看完整回答
反對 回復 2021-11-15
  • 3 回答
  • 0 關注
  • 267 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號