4

首先,让我说我不是 C++ 程序员大师。我有几年的 C++ 经验,但我的主要领域是 .NET/C#。

我正在寻找一种在 C++ 中创建动态代理/包装类的方法。特别是,我想要实现的是拦截方法调用。这种技巧在 Java/.NET 世界中很常见,但 C++ 缺乏反射。

我找到了一个在线教程,它解释了如何通过 -> 运算符重载创建包装器并拦截方法调用:

class Person{
  std::string mName;
  Person(std::string pName): mName(name){}
  void printName(){
     std::cout << mName << std::endl;
  }

};

template <class T >
class Wrap {
     T * p ;
     public:
             Wrap (T * pp ) :p (pp) { }
             Call_proxy <T> operator ->() {
                   prefix ();
                   return Call_proxy<T>(p);
             }
};
template <class T >
class Call_proxy {
       T * p ;
       public :
              Call_proxy (T * pp ) :p (pp ){ }
              ˜Call_proxy () {
                     suffix ();
               }
               T * operator ->() {
                          return p ;
                }
 };

正如您从这个示例中看到的,我们可以在调用之前和之后捕获方法调用事件,但我不清楚的是如何检测正在调用哪个方法?有可能吗?

谢谢

更新

好吧,为了让事情更清楚,我真的不在乎实现是否真正动态。拥有一个类似于智能指针的包装类对我来说很好。

4

1 回答 1

1

不,这是专门为非侵入性设计的,包装器所做的只是促进前缀和后缀的调用,然后返回被引用的对象,以便它可以调用指定的函数。如果 -> 运算符被重载,那么 object->function() 将扩展为 object.operator->()->function()。

这是 Stroustrup 所写论文的链接,内容非常丰富http://www.stroustrup.com/wrapper.pdf

于 2012-11-19T13:28:40.600 回答