C ++以任何方式将不同的模板化对象存储到同一个容器中

时间:2010-05-04 13:41:24

标签: c++ templates

我可以使用任何黑客来做到这一点:

template <class TYPE>
class Hello
{
     TYPE _var;
};

我想要一种存储方式

Hello<int> intHello and Hello<char*> charHello

进入同一个容器,例如队列/列表。

3 个答案:

答案 0 :(得分:10)

不,因为它们是不同的,完全不相关的类型。

但是,您可以使用继承和智能指针:

class HelloBase 
{
public:
    virtual ~HelloBase(); 
}

template <class TYPE>
class Hello : public HelloBase
{
    TYPE _var;
}

std::vector<boost::shared_ptr<HelloBase> > v;
您的实施可能会在shared_ptrstd::tr1命名空间中支持

std;你必须检查。

答案 1 :(得分:5)

是的,有点 - 但你可能不想。即使它们从同一模板开始,Hello<int>Hello<char *>也是完全独立且不相关的类型。包含两者的集合是异构的,包含所有需要的问题。

如果你坚持这样做,为了合理地干净利落,你通常会创建类似Boost::any的队列/列表。

答案 2 :(得分:4)

首先,真正的问题是:你想要达到的目标(更高层次)?

现在,对于这个特殊问题,有许多替代方案。容器无法存储异构数据,因此您可以:

  • 为所有Hello<T>提供一个公共基类并添加虚拟方法,然后使用指针,处理内存所有权(unique_ptrboost::ptr_list会很棒)
  • 如果有一组精确的类型,请使用boost::variant,它会被静态检查,以便您有合理的保证
  • 否则你应该考虑将它包装到一个存储类中,该存储类将使用boost::any封面

在这种情况下,常见的基类是常用方法。如果没有理由拥有多态性,那么最好使用variant,如果没有别的any