C ++,避免RTTI和访问者模式,是否可能?

时间:2013-03-14 09:39:53

标签: c++ design-patterns rtti visitor-pattern

我一直在寻找一些相关的主题,但仍然找不到任何能回答以下问题的内容。

假设我有一个构成树结构的类层次结构(例如Widgets,HTML元素)。当我遍历树或根据其ID查找具体元素时,我得到一个指向基类的指针(树算法只知道基类)。

然后,根据类型(基类有一个标识类型的字段),我执行dynamic_cast以获得指向具体类型的指针。我一直在想办法避免这种情况。我唯一想到的就是访客模式。但是不要非常喜欢这种模式。

是否有其他方法/模式来搜索/迭代节点并获得指向具体类的指针而不使用RTTI和访问者模式?

2 个答案:

答案 0 :(得分:0)

你的方法听起来不是一个好主意。主要是因为你必须在运行时之前做所有考虑。

您要做的事情基本上是列出并可访问对象的特定属性。通过动态铸造,这是可能的,但不是很优雅 - 因为你必须提前编写一系列开关和硬编码,以便在运行时使用它。

我通常推荐的解决方案是Qt框架。您可以在运行时列出每个对象的属性,通过其名称字符串或索引访问特定属性,甚至在运行时附加属性,这些属性在代码中不存在。所有这些都是类型不可知的,你不需要知道一个对象的类型来知道它的属性,最后 - Qt为QObject派生类而不是qobject_cast提供了明显更快的dynamic_cast

元系统允许您了解类名,基类名,方法,枚举,构造函数以及几乎所有内容,因此除了属性之外,它还是访问实例可用的所有功能的良好来源。 / p>

答案 1 :(得分:0)

这实际上取决于访客模式的实现。使用dynamic_cast<>是一种方式,另一种方法可能是通过定义可在所有子类中实现的虚拟GetType()函数来使用手工制作的RTTI。根据该功能的结果,您可以做不同的事情。