c ++设计问题
简化示例
template <typename T>
class Thing
{
T value;
public:
T get() { return value; }
};
template <typename T>
class Box
{
Thing<T> thing;
public:
T get() { return thing.get(); }
};
现在我需要存储不同类型的Box,比如
Box<string>,
Box<matrix>,
etc
容器中的(没有任何T类相关)。显然这是不可能的,因为对于每种类型的Box,T都不相同。我不能创建一个抽象的超类,因为T的返回类型变化,并且get()参数中没有任何内容可以区分哪些可以使用,如果我以某种方式提供替代实现。
如何解决这个问题是一种合理的方法。当然,我可以在抽象类中添加多个get(),但这似乎不是C ++ ish。在某些时候我将不得不检查isThisAString,isThisAMatrix,问题是什么是最合理的设计,假设我可能需要在将来添加专门的Box子类但仍然保持一组类似于get()的方法基于模板参数。
答案 0 :(得分:2)
答案 1 :(得分:0)
最后,我采用了无限制的联合技术。容器必须保存不同类型的值,但整个容器总是一种或另一种,目前是double或std :: string。我想要一个隐藏所有switch(type)语句的类。
像:
class TValue
{
TBlockType type;
union
{
TNumber aNumber;
TString aString;
};
...
创建后,类型不会更改。这些容器一旦创建就只保留一种类型。但是只有一个值类型类。唯一棘手的部分是你需要创建一些显式方法,因为编译器删除了内置版本,因为std :: string是非常重要的,在一个默认构造函数的情况下,我必须在创建默认值之前将union设置为null字符串。