2011-01-20 75 views
2

作爲一種工廠方法設置,我希望註冊函子,每個函子都創建不同類型的對象,但滿足一個通用接口 - 即所有創建子類爲核心類的創建對象。具有不同模板參數的模板對象的集合

說我有這樣的:

template <class T> struct FactoryMethod 
{ 
X* create(); 
} 

我不能有(IIRC)std::map<std::string,FactoryMethod*>因爲每個FactoryMethod模板專業化是一個獨立的類型。但我可以做到:

struct IFactoryMethod 
{ 
virtual X* create()=0; 
}; 
template <class T> struct FactoryMethod : public IFactoryMethod 
{ 
virtual X* create(); 
}; 
std::map<std::string,IFactoryMethod*> factories; 

,對嗎?我不知道標準STL有辦法使這個整潔,但我猜是提升 - 但是我們現在不使用提升,我仍然有興趣。

然後想法是factories可以根據類型名稱(例如從XML讀取)來查找以創建正確的類型。

回答

1

這被稱爲類型擦除,並且是一個相當常見的習慣用語 - 雖然您的地圖當然可以由所有權執行指針組成,您也可以像大多數理智的人一樣使用虛擬析構函數。

+0

它是僞代碼,給我一個休息!雖然你能澄清「所有權執行指針」嗎? – 2011-01-20 22:25:43