【发布时间】:2018-05-23 10:43:25
【问题描述】:
我有一棵树,用于存储不同类型的值,例如int、double、string 或其他。有一个实现基本树功能(子、父)的Base 类和一个派生类template<class T> class Derived: public Base,其中T 是要存储的值的类型。它有一个get函数来返回参数(一个模板函数返回类型T)
我正在使用Qt 进行用户界面,因此需要实现QAbstractItemModel 才能查看我的树。当子类化QAbstractItemModel 时,我需要能够调用Derived 类的get 函数,但我只有一个指向该类实例的指针(我从QAbstractItemModel 获得),并且不要不知道它的类型,因此我可以将指针转换为Base,但这不允许我调用get 函数。有没有办法从Base 类指针中找到我的Derived 类的类型?
【问题讨论】:
-
看起来像XY problem,请附上一些代码示例和您的实际目标的说明。
-
不,出于所有目的,
Derived<T>的每个不同实例化都是不同的类型。正如建议的那样,也许为您的问题提供更多背景信息有助于找到解决方案。 -
我对 Qt 没有经验,但我想所有项目都会以类似的方式呈现,例如作为字符串或类似的东西。也许你可以在
Base中有一个纯虚方法,称为getAsString(或任何你需要的东西),它返回值的公共表示,然后每个子类都可以实现它...... -
您似乎想要的类似于
boost::variant、QVariant或std::variant,具有学习底层类型的能力。关于提升,这个答案:stackoverflow.com/questions/8344080/… 建议你必须自己铸造和分支。QVariant有一个基于存储类型索引的type()函数:code.qt.io/cgit/qt/qtbase.git/tree/src/corelib/kernel/…。std::variant抛出无效获取:en.cppreference.com/w/cpp/utility/variant -
在大多数情况下 - 您需要从任何
Derived<T>添加到Base接口(即虚拟方法)。这是疯狂的猜测 - 因为你没有描述你的真正问题 - 你只描述了你想将解决方案应用于实际问题时遇到的问题 - 这基本上意味着在第一条评论中提到的 XY 问题
标签: c++ qt class data-structures