2010-05-04 75 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

相關問題