我正在尝试创建一个 vector (或者实际上是任何 STL 容器),它可以容纳一组不同的对象,这些对象是一种特定类型的子类。问题是我的基类是模板化的。
据我所知,我必须创建一个接口(interface)/抽象 super 基类(不确定首选的 C++ 术语是什么)。我不想这样做,而只是使用我的(模板化的)抽象基类。下面是一些示例代码。
基本上,有没有办法不需要 WidgetInterface
?以某种方式告诉编译器忽略模板要求?如果我必须有 WidgetInterface
,那么我使用以下方法是否正确?
#include <vector>
#include "stdio.h"
enum SomeEnum{
LOW = 0,
HIGH = 112358
};
// Would like to remove this WidgetInterface
class WidgetInterface{
public:
// have to define this so we can call it while iterating
// (would remove from Widget if ended up using this SuperWidget
// non-template baseclass method)
virtual void method() = 0;
};
template <class TDataType>
class AbstractWidget : public WidgetInterface{
public:
TDataType mData;
virtual void method() = 0;
// ... bunch of helper methods etc
};
class EnumWidget : public AbstractWidget<SomeEnum>{
public:
EnumWidget(){
mData = HIGH;
}
void method(){
printf("%d\n", mData); // sprintf for simplicity
}
};
class IntWidget : public AbstractWidget<int>{
public:
IntWidget(){
mData = -1;
}
void method(){
printf("%d\n", mData); // sprintf for simplicity
}
};
int main(){
// this compiles but isn't a workable solution, not generic enough
std::vector< AbstractWidget<int>* > widgets1;
// only way to do store abitary subclasses?
std::vector<WidgetInterface*> widgets2;
widgets2.push_back(new EnumWidget());
widgets2.push_back(new IntWidget());
for(std::vector<WidgetInterface*>::iterator iter = widgets2.begin();
iter != widgets2.end(); iter++){
(*iter)->method();
}
// This is what i'd _like_ to do, without needing WidgetInterface
// std::vector< AbstractWidget* > widgets3;
return 0;
}
最佳答案
不行,不能直接用AbstractWidget
作为 STL 容器或其他任何东西的参数。
原因是那个类AbstractWidget
不存在。它只是编译器构造类的模板。
存在的是AbstractWidget<SomeEnum>
和 AbstractWidget<int>
只因为 EnumWidget
和 IntWidget
继承自他们。
模板仅存在于编译器级别。如果AbstractWidget<T>
没有在您的代码中的任何地方使用,在运行时将没有痕迹。
因此,您发布的代码似乎是解决您问题的最佳(如果不是唯一)解决方案。
关于c++ - 将模板化基类的子类添加到没有超基类的容器中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9452462/