2009-06-26 49 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++行来实现 。还介绍了包装 的健壮版本。效率的主张由测量支持。