2010-05-04 69 views
3

是否有任何黑客,我可以用它来做到这一点:C++任何方式不同的模板对象存储到同一容器

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

我想一种方法来存储

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

到同容器,如队列/列表。

+0

你试图用这个做什么最终结果? – 2010-05-04 15:09:14

回答

9

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

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

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

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

std::vector<boost::shared_ptr<HelloBase> > v; 

shared_ptr可以通过您的实现无论是在std::tr1std命名空间的支持;你必须检查。

5

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

如果你仍然坚持这样做,要合理干净地做到这一点,你通常会创建一个队列/列表Boost::any

4

首先,真正的问题是:你想要达到什么(在更高的层次上)?

现在,对于这个特殊的问题有很多的选择。容器不能存储异构数据,使您可以:

  • 尽数一个共同的基类,并添加虚拟方法,然后使用指针,照顾内存的所有权(unique_ptrboost::ptr_list将是巨大的)
  • 如果有在一系列明确的类型,使用boost::variant,它的静态检查,所以你有合理的保证
  • 否则你应该考虑包成它将使用boost::any在底层存储类

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

+0

我认为这是一个非常好的答案。我错过了其他的变体。似乎是首选的方式。 – 2010-05-31 11:49:49

相关问题