c++ - 将模板化基类的子类添加到没有超基类的容器中?

标签 c++ templates stl

我正在尝试创建一个 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>只因为 EnumWidgetIntWidget继承自他们。

模板仅存在于编译器级别。如果AbstractWidget<T>没有在您的代码中的任何地方使用,在运行时将没有痕迹

因此,您发布的代码似乎是解决您问题的最佳(如果不是唯一)解决方案。

关于c++ - 将模板化基类的子类添加到没有超基类的容器中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9452462/

相关文章:

c++ - IZ3 cpp_example 段错误

c++ - 如何检查下标运算符是否存在?

c++ - 在 std 命名空间中添加模板特化

c++ - 在 VS 2013 中使用初始化列表初始化 map 的 map

c++ - 查找操作的时间复杂度

c++ - C++ 中的编译器和参数求值顺序

c++ - 如何使用具有相互依赖性的模板类?

c++ - 编译几个源文件(主文件和头文件)并在 ROOT CINT 中链接它们?

c++ - 如何在不假设任何构造函数的情况下获取构造函数和取消引用运算符(decltype)的类型?

c++ - 这应该有效吗?