C++容器、协方差和模板

C++ containers, covariance and template

本文关键字:方差 容器 C++      更新时间:2023-10-16

我有一些问题需要找到我的问题的相关解决方案。 我必须从类中返回一些数据,数据类型取决于类。 我的第一个解决方案是这样的:

class Base
{
virtual QVector<Data*> getData() const = 0;
};
class Derived : public Base
{
virtual QVector<DerviedData*> getData() const = 0;
};

但我知道这是不可能的,即使 DerivedData 扩展了数据,因为无效的协变返回类型。

所以我想出了另一个暗示模板的想法。我所做的是将基类转换为模板类:

template<class T>
class Base
{
virtual QVector<T*> getData() const = 0;
}

然后我可以像这样编写一个Derived构造函数:

Derived::Derived() : Base<DerivedData>() {}

但要知道我还有另一个问题。假设我编写了另一个类,该类具有在参数中采用任何基类的方法。

void Foo::doSomething(Base* b) { 
b->getData(); 
}

这不编译并说

在没有参数列表的情况下无效使用模板名称"Base">

我完全理解。

假设我的代码看起来像这样:

DerivedClass1 d1;
DerivedClass2 d2;
DerivedClass3 d3;
this->doSomething(&d1);
this->doSomething(&d2);
this->doSomething(&d3);

我在这里的解决方案是什么?我可以做一些类似"模板化"方法做的事情吗?

this->doSomething<DerivedData>(&d1);

用像这样的原型

template<class T>
void doSomething(Base<T>* b);

这可能吗?这是一种好的思维方式吗? 来自Java,我曾经通过使用通配符来解决此类问题

abstract List<? extends Data> getData();

但我听说C++中没有这样的事情(或多或少可以用std::is_base_of之类的东西来模拟)。

谢谢你的时间。

你可以让Derived::getData() 返回QVector<Data*>。当您需要使用它时,请找出QVector中的指针是指向Data还是DerivedData,使用dynamic_cast或类似方法。