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

时间:2017-03-29 15:16:02

标签: c++ templates covariant

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

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

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

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

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

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

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

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

但是知道我还有另外一个问题。假设我编写了另一个类,它有一个方法在参数中使用任何Base类。

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

这不编译并说

无效使用模板名称&#39; Base&#39;没有参数列表

我完全理解。

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

DerivedClass1 d1;
DerivedClass2 d2;
DerivedClass3 d3;

this->doSomething(&d1);
this->doSomething(&d2);
this->doSomething(&d3);

我的解决方案是什么?我可以做一些像&#34;模板&#34;方法doSomething?

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

使用类似

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

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

abstract List<? extends Data> getData();

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

感谢您的时间。

1 个答案:

答案 0 :(得分:1)

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