2009-06-26 30 views
3

我在想,如果我能做到的前/後函數調用在C++中莫名其妙。我有一個包含許多函數的包裝類,並且在每個包裝函數調用之後,我應該調用另一個始終是相同的函數。前/後函數調用實現

所以我不希望把他們postFunction()調用的功能,這樣每一個:

class Foo { 
    f1(); 
    f2(); 
    f3(); 
    . 
    . 
    . 
    fn(); 
} 

void Foo::f1() { 
    ::f1(); 
    postFunction(); 
} 

void Foo::f2() { 
    ::f2(); 
    postFunction(); 
} 

etc. 

相反,我想這postFunction呼叫自動來當我把一些Foo的成員函數。可能嗎?這將有助於維護..

+0

這聽起來像是從一兩個月前愚弄的人,但我不能找到它。我認爲有一些相當不錯的答案。 – crashmstr 2009-06-29 15:15:02

+0

[包裝C++成員函數調用(http://www.stroustrup.com/wrapper。pdf) – 2017-02-22 22:42:20

回答

11

可能是RAII的情況下!敦敦dunnn!

struct f1 { 
    f1(Foo& foo) : foo(foo) {} // pre-function, if you need it 
    void operator()(){} // main function 
    ~f1() {} // post-function 

private: 
    Foo& foo; 
} 

然後,您只需確保在每次調用該函數時都創建一個新的臨時f1對象。重用它顯然意味着前/後功能不會每次都被調用。

即使我包這樣的:

void call_f1(Foo& foo) { 
    f1(foo)(); // calls constructor (pre), operator() (the function itself) and destructor (post) 
} 

你可以實驗一下與構建它的其他方式,但在一般情況下,看看你不能得到構造函數/析構函數做繁重的您。

羅馬M的方法可能是一個好主意爲好。編寫一個通用包裝器,它將函子或函數指針作爲其參數。這樣一來,就可以之前並調用它的參數

3

聽起來像使用AspectC++

+0

矯枉過正。請參閱下面的jalf的回答,使用一個臨時變量,它的構造函數和析構函數分別是pre和post,這是一個非常普遍和直接的做法。 – 2009-06-26 22:43:39

5

實現一個包裝,將一個函數指針作爲參數的Aspect Oriented Programming工作,並調用前\後函數的函數調用之前。

Foo::caller (function* fp) { 
    preCall(); 
    fp (...); 
    postCall(); 

} 
2

正如Richie指出的那樣,您可能正在尋找面向方面編程(Aspect Oriented Programming)。

如果不適合你的工作,雖然,你有另一種選擇是寫另一個包裝類。說,而不是美孚,你有一個名爲IFoo的界面。然後,您可以編寫一個包裝類,以確保適當的前置和後置調用用於

class IFoo { 
public: 
    void Bar(); 
} 

class FooWrapper: public IFoo { 
public: 
    FooWrapper(IFoo* pFoo) { 
    m_pFoo = pFoo; 
    } 
    void Bar() { 
    PreBar(); 
    m_pFoo->Bar(); 
    PostBar(); 
    } 
} 
0

我想答案已經被C++ B.Stroustrup的父親發出後致電前/後功能。

Wrapping C++ Member Function Calls

本文提出了一種簡單,通用,高效的解決方案的 老問題「‘包裹’」調用來在對前綴和後綴碼的目的。該解決方案也是非侵入式的,適用於現有的類,允許使用多個前綴/後綴對,並且可以用15個簡單的標準C++行來實現 。還介紹了包裝 的健壯版本。效率的主張由測量支持。