【问题标题】:C++ containers, covariance and templateC++ 容器、协方差和模板
【发布时间】:2017-08-23 04:21:16
【问题描述】:

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

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;
}

然后我可以像这样写一个Derivedconstructor:

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

但知道我还有另一个问题。假设我写了另一个类,它有一个方法可以接受任何 Base 类的参数。

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

这不编译和说

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

我完全理解。

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

DerivedClass1 d1;
DerivedClass2 d2;
DerivedClass3 d3;

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

我的解决方案是什么?我可以做类似“模板化”方法 doSomething 的事情吗?

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

使用像

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

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

abstract List<? extends Data> getData();

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

感谢您的宝贵时间。

【问题讨论】:

  • 这可能吗?嗯..你试过了吗?
  • DerivedData 是否继承自 Data?那么这不是问题。
  • @AlgirdasPreidžius:不,我没有尝试。因为这对我来说很奇怪,所以我想知道这是否是一个更好的解决方案,但我会试一试。
  • @Someprogrammerdude :是的,DerivedData 继承自 Data。但是你在说什么问题?
  • @B.Oudot 那么,你为什么不试试呢?似乎尝试编译这样的代码会更快,在 SO 上写一个问题,反过来可能会回答你的问题。

标签: c++ templates covariant


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-16
    • 2011-03-21
    • 2020-07-05
    • 1970-01-01
    相关资源
    最近更新 更多