【发布时间】:2013-04-20 21:14:43
【问题描述】:
我有有限数量的类,它们的实现几乎相同,唯一不同的是它们操作的底层数据类型:
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:如何在几个完全专用的模板类上实现抽象基类?
【问题讨论】:
-
你希望通过添加这个基类来做什么?对此的了解将有力地塑造潜在的答案。
-
基本上,我希望有一组强类型派生类方法(即不能在
BoolContainer上调用setData(int data)),但能够迭代一组这些类(可能是std::vector<Base*>)。 -
...但也许我这些天在用 Objective-C 思维思考太多了。
-
当您想将此行为延迟到运行时(这些对象的任意集合)时,我认为错误的选择是选择编译时多态性(模板)
标签: c++ templates inheritance abstract-class