C++中的动态代理类,是否可行?

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 ;
                }
 };

从这个示例中可以看出,我们可以捕获方法调用事件,在调用前和调用后进行捕获,但是对我来说不清楚的是如何检测到正在调用哪个方法?这是否可能?

谢谢

更新

好的,为了让事情更加清晰,我并不在乎实现是否真正动态。对我来说,拥有类似智能指针的包装器类就可以了。


2
你能给出一些代码示例,说明你想要做什么吗?显然,这段代码不知道类有哪些方法。因此,即使其他代码知道该方法,它也能给这段代码什么呢? - David Schwartz
也许只有我这么认为,但是“反射”与“动态代理类”有什么关系呢?反射是关于数据结构及其自我描述能力的。作为第一个答案,我会说您正在寻找一种策略类机制,就像Andrei Alexandrescu在他自己的现代C++书中所描述的那样。 - user1824407
您发布的代码仅在您调用的方法之前和之后添加了一个方法(使用RAII powertool)。 这是您想要的吗?您所说的“我想要实现的是拦截方法调用”是什么意思? - Alessandro Teruzzi
你能展示一些可以完成工作的C#代码吗?了解你想要实现什么可能会有所帮助。 - Alessandro Teruzzi
你的平台是Windows还是Linux? - Saddam Abu Ghaida
显示剩余3条评论
1个回答

1
不是的。这是专门设计成非侵入式的,所有的包装器都只是为了调用前缀和后缀并返回被引用的对象,以便它可以调用指定的函数。如果 -> 运算符被重载,那么 object->function() 就会扩展为 object.operator->()->function()。
这里有一篇 Stroustrup 写的论文链接,非常有启发性 http://www.stroustrup.com/wrapper.pdf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接