【问题标题】:Cast QList of derived to QList of base将派生的 QList 转换为基的 QList
【发布时间】:2021-12-22 18:38:49
【问题描述】:

我有这些课程:

class IParameter {};
class ModuleParameter : public IParameter {};

现在我有派生的 QList:

QList<ModuleParameter*> list;

当我施放单个物品时没关系:

IParameter *p = list[0]; // ok

当我投射列表时出现错误。

QList<IParameter*> *list = static_cast<QList<IParameter*>*>(&list);

Invalid static_cast from type QList&lt;ModuleParameter*&gt;* to type QList&lt;IParameter*&gt;*.

那么,我该如何投射?

【问题讨论】:

  • 考虑 std::copy 或 std::transform

标签: c++ qt


【解决方案1】:

如果你真的想要一个 QList,你可以这样做:

    QList<A*> la;
    QList<B*> lb;
    ...
    std::transform(lb.cbegin(),
                   lb.cend(),
                   std::back_inserter(la),
                   [=](B* b)
    {
        return static_cast<A*>(b);
    });

【讨论】:

  • 这段代码可以复制,但是可以强制转换吗?
  • 不,就像 Swift 说的,QList&lt;A*&gt;QList&lt;B*&gt; 是两种不同的类型。
  • @maestro cast 也会创建一个副本。指针的转换是不安全的,只允许重新解释)。
  • 他们是否在 Qt 后期版本中重构了 QList?它曾经没有 cbegin/cend,但重载了 begin/end 和一些迭代问题。
【解决方案2】:

QList是一个没有公共基类类型的模板,QList&lt;ModuleParameter*&gt;是一个与QList&lt;IParameter*&gt;无关的类型,你不能通过指向QList&lt;IParameter*&gt;的指针多态地访问QList&lt;ModuleParameter*&gt;。你试图做的事情是不可能这样做的。

相反,您可以将指向ModuleParameter 的指针存储在QList&lt;IParameter*&gt; 中,并在访问它们时使用强制转换。

【讨论】:

  • 那么,您对任何模板类的概述是否正确?
  • @maestro 适用于任何类型。由具有唯一模板参数集的模板创建的类型是唯一类型(模板本身不是类型)。可以创建静态或动态多态的模板,但这需要继承,而 QList 不是。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-13
  • 1970-01-01
相关资源
最近更新 更多