C ++模板类设计具有不同的方法返回类型

时间:2014-04-10 15:37:41

标签: c++ templates

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()的方法基于模板参数。

2 个答案:

答案 0 :(得分:2)

您所看到的被称为“类型擦除”。有几种实现方式:

答案 1 :(得分:0)

最后,我采用了无限制的联合技术。容器必须保存不同类型的值,但整个容器总是一种或另一种,目前是double或std :: string。我想要一个隐藏所有switch(type)语句的类。

像:

class TValue
{
TBlockType type;
union
{
    TNumber aNumber;
    TString aString;
};
...

创建后,类型不会更改。这些容器一旦创建就只保留一种类型。但是只有一个值类型类。唯一棘手的部分是你需要创建一些显式方法,因为编译器删除了内置版本,因为std :: string是非常重要的,在一个默认构造函数的情况下,我必须在创建默认值之前将union设置为null字符串。