我正在研究某种形式的C ++反思系统,尽管许多人已经发出警告。我正在寻找的是一组接口IScope,IType,IMember,IMonikerClient和一个包装类,其中包含上述说的CReflexion。忽略除了这里重要部分的所有成员,我想做的是:
1)实例包装器
2)确定要使用的类型
3)实例类型
4)重载()和[]以便在代码中从外部(包装器)访问包含的成员,就像使用std :: vector
时一样容易我发现使用0x我可以使用任何类型的参数转发方法调用。然而,我无法动态投射,因为施法者不会接受变量(除非有我不知道的方法!)
我将上面粗略的想法联系起来。我目前正在使用switch语句来处理不同的接口。我会,并且出于显而易见的原因,想要解决这个问题。我在切换案例中得到类型匹配错误,作为调用方法的一个原因,针对每种情况进行编译,其中只有三个中的一个适用于任何条件和编译器错误。
有人可以向我提出任何建议吗?除了坚持使用VARIANT:/
谢谢!
答案 0 :(得分:1)
C ++,即使在“0x land”中,也不会暴露出创建反射所需的信息。
我发现使用0x我可以使用任何类型的参数转发方法调用。
您无法将类型转发为参数。您可以在成员上转发const-volatile限定符,但这些都是在编译时在模板中完成的。当你使用像forward这样的东西时,不会进行任何运行时检查。
除非T
可以一次性转换为int*
,string*
和A**
,否则您的operator()模板不会编译。将模板视为一种简单的查找和替换算法,可以为您生成多个函数 - 在实例化模板时,T的值将替换为typename,并且函数将按正常方式编译。
最后,您只能使用dyanmic_cast
来强制转换类层次结构 - 在完全不相关的类型之间进行转换A B和C无法正常运行。
你最好花时间重新考虑你的设计,使其根本不使用反射。无论如何,它可能是一个更好的设计,即使在反射语言中,反射最常用于描述糟糕的设计。