【问题标题】:Dynamic proxy classes in C++. Is it possible?C++ 中的动态代理类。是否可以?
【发布时间】:2012-11-19 13:01:57
【问题描述】:

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

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

我找到了一个online tutorial,它解释了如何通过->运算符重载来创建包装器和拦截方法调用:

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

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

谢谢

更新

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

【问题讨论】:

  • 你能给出一些你想做的代码示例吗?很明显,这段代码不知道这个类有什么方法。所以即使其他一些代码知道这个方法,它能给这个代码什么?
  • 这里的简单答案是“不”。 C++ 只有最简单的内省。您可以想象实现自己的函数表并自己处理调度并提供此类功能,但会有很大的开销。或者,如果您只想处理少量类,您可以创建子类而不是代理。如果您正在处理特定命名的函数,您可以在您的代理中显式地实现它们。除此之外,我认为你运气不好!
  • 可能只有我一个人,但“反射”与“动态代理类”有什么关系?反思是关于数据结构及其描述自身的能力。作为第一个答案,我会说您正在寻找一种策略类机制,正如 Andrei Alexandrescu 在他自己的关于现代 C++ 的书中所描述的那样。
  • 您发布的代码只是在您调用的方法之前和之后添加了一个方法(使用 raii powertool)。是你想要的吗?什么意思:“我要实现的是拦截一个方法调用”?
  • 你能展示一些可以完成这项工作的 c# 代码吗?了解您想要实现的目标可能会有所帮助。

标签: c++ dynamic-proxy


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    相关资源
    最近更新 更多