【发布时间】: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