【问题标题】:Cast pointer of base class to derived template class without knowing the type在不知道类型的情况下将基类的指针转换为派生的模板类
【发布时间】:2018-05-23 10:43:25
【问题描述】:

我有一棵树,用于存储不同类型的值,例如intdoublestring 或其他。有一个实现基本树功能(子、父)的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::variantQVariantstd::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


【解决方案1】:

您的 Tree 不存储 不同 类型的值,它根据模板实例化存储相同类型(int、double、carottes、cabages)的值。 这与拥有 QVariant 或任何可代理对象的树到多态类非常不同。

模板在实际实例化之前一直使用。您需要创建一个从 QAbstractItemModel 派生的 T 模板类,您将实例化与 T 的类型相关的。

template <typename T> class MyCustomItemModel : public QAbstractItemModel;

//...
Tree<Cabagge> MyCabaggeTree;
MyCustomModel<Cabagge> MyCabaggeModel; 

【讨论】:

  • 如果模板被实例化为不同的类型,则模板实例本身就是不同的类型。
  • 当然。这不正是我要说的吗?
  • 你说:“你的树确实存储不同类型的值”不,它做到了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-22
  • 1970-01-01
  • 2014-12-25
  • 1970-01-01
  • 2013-09-23
  • 2014-07-06
  • 2012-01-02
相关资源
最近更新 更多