c++ 如何拦截方法调用?

disho6za  于 2023-01-15  发布在  其他
关注(0)|答案(1)|浏览(149)

请先参考此问题:
How to ensure that every method of a class calls some other method first?
通过重载-〉运算符,我们可以在使用-〉的时候调用某个函数,我想知道是否有什么方法可以找出调用的是什么函数?
示例:

struct foo{

void func1(){

}

void func2(){

}

}

struct Bar{

void someFunc(foo* f){
    f->func1();
}

}

struct Baz{

void someFunc(foo* f){
    f->func2();
}

}

在上面的例子中,Bar和Baz可以调用func1和func2。一种方法是在每个类中实现一些代码,这些代码调用一个日志记录函数,通知它正在调用的方法名称。
另一种方法是重载-〉运算符来调用log()函数

struct LoggingFoo : private Foo {
    void log() const { }

    // Here comes the trick
    Foo const *operator -> () const { log(); return this; }
    Foo       *operator -> ()       { log(); return this; }
};

唯一的问题是如何将一些信息传递给log(),以便它知道正在调用的是什么函数?
编辑:
找到了另一种方法:
https://www.codeproject.com/Articles/34237/A-C-Style-of-Intercepting-Functions

x8diyxa7

x8diyxa71#

使用这种技术是不行的,在log()被调用的时候,方法调用还没有发生,没有关于哪个方法将被调用的上下文信息。
这里发生的是,首先调用操作符->,然后发生func2调用,与此没有什么不同:

void someFunc(foo* f){
  foo *f2 = f.operator->(); // log is called here
  f2->func2();              // method is invoked here
}

log()无法记录尚未发生的事件。

相关问题