2011-07-29 53 views
4

我想在返回另一個函數之前執行某個函數。問題是有多個回報,我不想在每個回覆之前複製粘貼我的電話。有沒有更好的方法來做到這一點?以C++返回的觸發器事件

void f() 
{ 
    //do something 
    if (blabla) 
     return; 
    //do something else 
    return; 
    //bla bla 
} 

我想在函數返回之前調用g()。

+0

寫調度員:'無效call_f(){F(); G(); }' –

回答

12
struct DoSomethingOnReturn { 
    ~DoSomethingOnReturn() { 
    std::cout << "just before return" << std::endl; 
    } 
}; 
... 
void func() { 
    DoSomethingOnReturn a; 
    if(1 > 2) return;  
} 
+0

或者有一個ScopeGuard – unkulunkulu

+0

@ loki2302不錯的竅門,但對我來說似乎有點矯枉過正......我只是在簡單的函數調用中包裝任何複雜性並將其返回給語法sugar –

+1

@Lea Hayes:爲什麼?簡單而習慣的解決方案。 – agibalov

0
int g() { 
    // blah 
    return 0; 
} 

void f() { 
    // do something 
    if (blabla) 
     return g(); 
    // do something else 
    return g(); 
} 
+0

但是,如果blabla是真的,g()永遠不會被調用... –

+0

@Luchian對不起,我誤讀你的問題,我已經更新了我的答案 –

2

對於這種事情,你可以簡單地使用一個布爾值。這樣,你不必如果太多/ 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; 
} 
+0

+1好主意,但我喜歡loki更好:) –

2
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(); 
} 
+0

無法訪問到哪裏f ()被稱爲... –

7

有一些方法可以做到所謂的這個。
一個將使用boost::scope_exit或使用一個結構,並在析構函數中做你的工作。
我不喜歡boost的預處理器語法,我懶得寫結構,所以我更喜歡使用boost :: shared_ptr或在較新的編譯器上使用std :: shared_ptr。就像這樣:

std::shared_ptr<void>(nullptr, [](void*){ /* do your stuff here*/ }); 
+0

+1,很好!實際上,我認爲boost應該有一個版本的scope_exit,它可以在C++ 0x編譯器上利用這個版本! –

4

這往往是,而不是想盡一切迴歸之前,人爲地做一些事情,你應該嘗試重構你的函數爲單出口形式的標誌。然後,您可以非常輕鬆地完成額外步驟,因爲......只有一次回報。

+0

如果拋出異常會怎樣? – Mark

4

我認爲try-finally語句會做你想做的。

void f() 
{ 
    __try 
    { 
     //do something 
     if (blabla) 
      return; 
     //do something else 
     return; 
     //bla bla 
    } 
    __finally 
    { 
     g(); 
    } 
} 

在try-finally語句是微軟擴展到C和C++語言 使目標應用程序時的代碼塊的執行被中斷,以保證 清理執行代碼。清理 由釋放內存,關閉文件和釋放文件句柄等任務組成。 try-finally語句對於有幾個地方的例程特別有用 ,在這些地方檢查可能導致例程過早返回的 錯誤。

msdn.

+0

它不是C++,它是特定於Microsoft的擴展。 – agibalov

+0

已經在我的回答中提到過。它是C和C++的微軟擴展。但我不認爲使用擴展使其成爲非C++。 –

3
#define RETURN_IT g(); \ 
     return; 

void f() 
{ 
    //do something 
    if (blabla) 
     RETURN_IT; 
    //do something else 
    RETURN_IT; 
    //bla bla 
} 

簡單引用,雖然我有點像洛基的建議

+0

還不錯。謝謝。 –