前/后函数调用实现

时间:2009-06-26 22:23:43

标签: c++ function

我想知道我是否能以某种方式在C ++中进行前/后函数调用。我有一个包含很多函数的包装类,在每次包装函数调用之后,我应该调用另一个函数。

所以我不想把postFunction()调用放到这样的每一个函数中:

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

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

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

etc.

相反,当我调用一些Foo的成员函数时,我希望自动调用postFunction。可能吗?这有助于维护......

5 个答案:

答案 0 :(得分: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)
}

你可能会尝试使用其他结构方法,但总的来说,看看你是否不能让构造函数/析构函数为你做繁重的工作。

Roman M的方法也许是一个好主意。编写一个通用包装器,它以函子或函数指针作为参数。这样,它可以在调用其参数

之前和之后调用前/后函数

答案 1 :(得分:5)

实现一个将函数指针作为参数的包装器,并在函数调用之前调用pre \ post函数。

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

}

答案 2 :(得分:3)

使用Aspect Oriented Programming

感觉AspectC++的作业

答案 3 :(得分:2)

正如Richie指出的那样,你可能正在寻找面向方面编程。

如果这对你不起作用,你有另一个选择就是编写另一个包装类。比起Foo,你有一个名为IFoo的接口。然后,您可以编写一个包装类,以确保使用正确的前置和后置调用

class IFoo { 
public:
  void Bar();  
}

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

答案 4 :(得分:0)

我认为答案是由C ++ B.Stroustrup的父亲给出的。

Wrapping C++ Member Function Calls

  

本文提出了一个简单,通用,有效的解决旧问题的方法   ''wrap''以成对的前缀和后缀代码调用对象。解决方案也是   非侵入式,适用于现有类,允许使用多个前缀/后缀对,以及   可以用标准C ++的15个简单行来实现。一个强大的包装版本   也出席了。效率的要求得到了衡量的支持。