我想在返回另一個函數之前執行某個函數。問題是有多個回報,我不想在每個回覆之前複製粘貼我的電話。有沒有更好的方法來做到這一點?以C++返回的觸發器事件
void f()
{
//do something
if (blabla)
return;
//do something else
return;
//bla bla
}
我想在函數返回之前調用g()。
我想在返回另一個函數之前執行某個函數。問題是有多個回報,我不想在每個回覆之前複製粘貼我的電話。有沒有更好的方法來做到這一點?以C++返回的觸發器事件
void f()
{
//do something
if (blabla)
return;
//do something else
return;
//bla bla
}
我想在函數返回之前調用g()。
struct DoSomethingOnReturn {
~DoSomethingOnReturn() {
std::cout << "just before return" << std::endl;
}
};
...
void func() {
DoSomethingOnReturn a;
if(1 > 2) return;
}
或者有一個ScopeGuard – unkulunkulu
@ loki2302不錯的竅門,但對我來說似乎有點矯枉過正......我只是在簡單的函數調用中包裝任何複雜性並將其返回給語法sugar –
@Lea Hayes:爲什麼?簡單而習慣的解決方案。 – agibalov
int g() {
// blah
return 0;
}
void f() {
// do something
if (blabla)
return g();
// do something else
return g();
}
但是,如果blabla是真的,g()永遠不會被調用... –
@Luchian對不起,我誤讀你的問題,我已經更新了我的答案 –
對於這種事情,你可以簡單地使用一個布爾值。這樣,你不必如果太多/ else語句:
void f()
{
//do something
done = false;
if (blabla)
done = true;
//do something else
if (!done) {
// some code
done = true;
}
if (!done) {
// some other code
done = true;
}
return;
}
+1好主意,但我喜歡loki更好:) –
void f()
{
//do something
if (blabla)
return;
//do something else
return;
//bla bla
}
void f_callg()
{
f();
g();
}
如果進不去其中f()從
void f_copy_of_old()
{
//do something
if (blabla)
return;
//do something else
return;
//bla bla
}
void f()
{
f_copy_of_old();
g();
}
無法訪問到哪裏f ()被稱爲... –
有一些方法可以做到所謂的這個。
一個將使用boost::scope_exit或使用一個結構,並在析構函數中做你的工作。
我不喜歡boost的預處理器語法,我懶得寫結構,所以我更喜歡使用boost :: shared_ptr或在較新的編譯器上使用std :: shared_ptr。就像這樣:
std::shared_ptr<void>(nullptr, [](void*){ /* do your stuff here*/ });
+1,很好!實際上,我認爲boost應該有一個版本的scope_exit,它可以在C++ 0x編譯器上利用這個版本! –
這往往是,而不是想盡一切迴歸之前,人爲地做一些事情,你應該嘗試重構你的函數爲單出口形式的標誌。然後,您可以非常輕鬆地完成額外步驟,因爲......只有一次回報。
如果拋出異常會怎樣? – Mark
我認爲try-finally語句會做你想做的。
void f()
{
__try
{
//do something
if (blabla)
return;
//do something else
return;
//bla bla
}
__finally
{
g();
}
}
在try-finally語句是微軟擴展到C和C++語言 使目標應用程序時的代碼塊的執行被中斷,以保證 清理執行代碼。清理 由釋放內存,關閉文件和釋放文件句柄等任務組成。 try-finally語句對於有幾個地方的例程特別有用 ,在這些地方檢查可能導致例程過早返回的 錯誤。
它不是C++,它是特定於Microsoft的擴展。 – agibalov
已經在我的回答中提到過。它是C和C++的微軟擴展。但我不認爲使用擴展使其成爲非C++。 –
#define RETURN_IT g(); \
return;
void f()
{
//do something
if (blabla)
RETURN_IT;
//do something else
RETURN_IT;
//bla bla
}
簡單引用,雖然我有點像洛基的建議
還不錯。謝謝。 –
寫調度員:'無效call_f(){F(); G(); }' –