具有多个模板专用派生类的通用基类

Gui*_*gis 8 c++ inheritance templates abstract-class

我有一个有限数量的类与几乎相同的实现,唯一不同的是他们操作的基础数据类型:

class IntContainer
{
public:
    void setData(int data);
    int getData();
    int _data;
};

class BoolContainer
{
public:
    void setData(bool data);
    bool getData();
    bool _data;
};

class StringContainer
{
public:
    void setData(std::string data);
    std::string getData();
    std::string _data;
};

// Etc. You get the idea.
Run Code Online (Sandbox Code Playgroud)

我想通过使用如下模板来减少这些类的代码重复:

template<typename T>
class GenericContainer
{
public:
    void setData(T data);
    T getData();
    T _data;
};
Run Code Online (Sandbox Code Playgroud)

专业化:

typedef GenericContainer<int> IntContainer;
typedef GenericContainer<bool> BoolContainer;
typedef GenericContainer<std::string> StringContainer;
Run Code Online (Sandbox Code Playgroud)

这很好用.我还想为这些专用类添加一个抽象基类,以便能够以通用方式操作它们(例如,在集合中).问题是这个基类应该有getDatasetData方法能够调用它们,即使不知道被操纵的对象的动态类型.

我会用这样的东西实现它:

class Base
{
public:
    virtual void setData(??? data) = 0;
    virtual ??? getData() = 0;
};

// Modify GenericContainer's definition like so
template<typename T>
class GenericContainer : Base { ... }
Run Code Online (Sandbox Code Playgroud)

并以某种方式使用它:

int main(int argc, char const *argv[])
{
    IntContainer intc = IntContainer();
    intc.setData(42);
    std::cout << intc.getData() << std::endl;

    BoolContainer boolc = BoolContainer();
    boolc.setData(false);
    std::cout << boolc.getData() << std::endl;

    std::vector<Base> v;
    v.push_back(intf);
    v.push_back(boolf);

    for (std::vector<Base>::iterator it = v.begin() ; it != v.end(); ++it)
        std::cout << it->getData() << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

问题是我不知道如何编写Base方法原型,因为类型是未知的(并且无关紧要,应该在运行时根据对象的动态类型调用派生类实现).

TL; DR:如何在几个完全专用的模板类上实现抽象基类?

sya*_*yam 5

根本没办法做你想做的事.

问题是,如果允许这样做,编译器必须在基类中生成尽可能多的虚方法,因为模板子类的可能特化(即无穷大)是不可能的.