2011-10-24 47 views
1

假設我有200個類名爲class1,類2等從類派生,並在1到200之間的整數,有沒有辦法具體實例化取決於派生類的一個我的整數值?顯然,我可以手動檢查每一個值,但我不知道是否有在C++什麼是更靈活C++ - 根據上下文實例化派生類

回答

5

你將不得不做一臺交換機上的整數,實例化的具體類。如果你在程序的其他地方有這個int - >class邏輯,你可以考慮用編譯時地圖來代表它。看看Boost.MPL,特別是boost::mpl::map

1

如果你正在尋找一個反射式系統,在這裏你可以看到所有的類,然後實例化它們動態無。您可以在運行時對象上使用typeid來查看它們是否相同,但我相信它的行爲是實現定義的。

1

如果你能模板類,即名稱,而不是他們

template <int I> class Foo; 

class FooI 

,您可以使用編譯時或運行時的數據結構來選擇合適的類。

+0

是否有可能做一些新的線Foo 只有在運行時才知道? – lezebulon

+0

不,但您可以通過我或查找表輕鬆設置編譯時遞歸來選擇正確的Foo。 – thiton

2

這可能只是一個做同樣的事情的更長的路,但你可以有像這樣每個派生類中的工廠方法...

std::auto_ptr<BaseClass> createClass0() 
{ 
    return std::auto_ptr<BaseClass>(new Class0()); 
} 

然後定義這些功能的陣列

typedef std::auto_ptr<BaseClass> (*pt2Creator)(); 
pt2Creator creators[] = {createClass0, ...}; 

然後,你可以做

std::auto_ptr<BaseClass> createClass(int n) 
{ 
    return creators[n](); 
} 

如果你試圖讓編寫代碼的對於每個類,這不會對你有所幫助,但是如果問題是在運行時根據整數創建哪個類,那麼這將做到這一點。

您可能還想使用標準集合類型而不是C風格的數組。