C++ 容器、协变和模板
C++ containers, covariance and template
我有一些问题需要找到相关的解决方案来解决我的问题。
我必须 return 来自 class 的一些数据,数据类型取决于 class。
我的第一个解决方案是:
class Base
{
virtual QVector<Data*> getData() const = 0;
};
class Derived : public Base
{
virtual QVector<DerviedData*> getData() const = 0;
};
但我知道这是不可能的,即使 DerivedData 扩展了数据,因为协变 return 类型无效。
所以我想出了另一个暗示模板的想法。我所做的是将 Base class 变成模板 class :
template<class T>
class Base
{
virtual QVector<T*> getData() const = 0;
}
然后我可以像这样写一个 Derived
构造函数 :
Derived::Derived() : Base<DerivedData>() {}
但知道我还有另一个问题。假设我写了另一个 class,它有一个在参数中接受任何 Base class 的方法。
void Foo::doSomething(Base* b) {
b->getData();
}
这不编译并说
在没有参数列表的情况下无效使用模板名称 'Base'
我完全理解。
假设我的代码如下所示:
DerivedClass1 d1;
DerivedClass2 d2;
DerivedClass3 d3;
this->doSomething(&d1);
this->doSomething(&d2);
this->doSomething(&d3);
我的解决方案是什么?我可以做类似 "templating" 方法 doSomething 的事情吗?
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(
)returnQVector<Data*>
。当你需要使用它时,用dynamic_cast
或类似的方法找出QVector
中的指针是指向Data
还是DerivedData
。
我有一些问题需要找到相关的解决方案来解决我的问题。 我必须 return 来自 class 的一些数据,数据类型取决于 class。 我的第一个解决方案是:
class Base
{
virtual QVector<Data*> getData() const = 0;
};
class Derived : public Base
{
virtual QVector<DerviedData*> getData() const = 0;
};
但我知道这是不可能的,即使 DerivedData 扩展了数据,因为协变 return 类型无效。
所以我想出了另一个暗示模板的想法。我所做的是将 Base class 变成模板 class :
template<class T>
class Base
{
virtual QVector<T*> getData() const = 0;
}
然后我可以像这样写一个 Derived
构造函数 :
Derived::Derived() : Base<DerivedData>() {}
但知道我还有另一个问题。假设我写了另一个 class,它有一个在参数中接受任何 Base class 的方法。
void Foo::doSomething(Base* b) {
b->getData();
}
这不编译并说
在没有参数列表的情况下无效使用模板名称 'Base'
我完全理解。
假设我的代码如下所示:
DerivedClass1 d1;
DerivedClass2 d2;
DerivedClass3 d3;
this->doSomething(&d1);
this->doSomething(&d2);
this->doSomething(&d3);
我的解决方案是什么?我可以做类似 "templating" 方法 doSomething 的事情吗?
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(
)returnQVector<Data*>
。当你需要使用它时,用dynamic_cast
或类似的方法找出QVector
中的指针是指向Data
还是DerivedData
。