我有有限数量的类具有几乎相同的实现,唯一不同的是它们操作的底层数据类型:
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.
我想通过使用这样的模板来减少这些类的代码重复:
template<typename T>
class GenericContainer
{
public:
void setData(T data);
T getData();
T _data;
};
和专业:
typedef GenericContainer<int> IntContainer;
typedef GenericContainer<bool> BoolContainer;
typedef GenericContainer<std::string> StringContainer;
这很好用。但我还想为这些专门的类添加一个抽象基类,以便能够以通用方式(例如在集合中)操作它们。问题是这个基类应该有getData
和setData
方法,即使不知道被操作对象的动态类型也能调用它们。
我会用这样的东西来实现它:
class Base
{
public:
virtual void setData(??? data) = 0;
virtual ??? getData() = 0;
};
// Modify GenericContainer's definition like so
template<typename T>
class GenericContainer : Base { ... }
并以某种方式使用它:
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;
}
问题是我不知道如何编写Base
方法原型,因为类型是未知的(没关系,应该在运行时根据对象的动态类型调用派生类实现)。
TL;DR:如何在几个完全专业化的模板类上实现抽象基类?