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

TA貢獻1853條經驗 獲得超9個贊
這已經存在,它被稱為范圍保護??吹竭@個精彩的演講:https : //channel9.msdn.com/Shows/Going+Deep/C-and-Beyond-2012-Andrei-Alexandrescu-Systematic-Error-Handling-in-C。這使您可以輕松創建要在退出時調用的任意可調用對象。這是較新的版本;它最初是在 go 出現之前很久就被開發出來的。
它在一般情況下完美運行,但我不確定你所說的處理異常是什么意思。從必須在作用域退出時調用的函數拋出異常是一團糟。原因:當拋出異常(而不是立即捕獲)時,當前作用域退出。所有析構函數都會運行,異常將繼續傳播。如果其中一個析構函數拋出異常,你會怎么做?您現在有兩個實時異常。
我想有一種語言可以嘗試處理這個問題,但它非常復雜。在 C++ 中,拋出析構函數被認為是一個好主意是非常罕見的。

TA貢獻1824條經驗 獲得超8個贊
這在 C++ 中已經存在,這是一個非常糟糕的主意,你給出的例子說明了為什么這是一件毫無意義的事情,我希望委員會永遠不會引入它。
例如,如果您有一個文件句柄,然后編寫一個類來為您完成它,然后您就不必為每個用例編寫 defer 語句,而您很容易忘記這樣做?;蛘咧皇呛唵蔚嘏e了。你寫一個析構函數,一次。就是這樣。然后,您可以保證該類的所有用途都是安全的。它更安全,更容易。
- 3 回答
- 0 關注
- 267 瀏覽
添加回答
舉報