2012-04-05 167 views
2

我正在嘗試製作資源加載器,並希望擁有類資源和模板類資源管理器。不同類型的資源繼承自基礎資源類,例如圖像,三維網格等。C++模板限於基類及其派生類

我可以爲任何類型的資源創建映射,但是接下來我將無法調用特定於派生類的函數。 3dMesh可能具有getVertecies(),其中圖像可能具有getWidth()等。

因此,我打算使用模板化的resourceManager類。

然後,你可以創建資源管理器,如:

resourceManager<3dMesh> resMan3DMeshes(); 
resourceManager<picture> resManPictures(); 

資源管理器將返回的資源類型,而不是基礎資源類的指針。這樣你可以調用特定於每種資源類型的函數。

pointerToMesh->getVerticies(); 
pointerToPicture->getWidth(); 

但是,使用這種方法,您可以傳入任何東西來創建資源管理器。

resourceManager<int> resManInts(); 

這樣可以,除非資源管理器應該能夠調用基本資源類的功能。例如,基本資源類將具有用於從文件加載的虛擬函數,但資源管理器將無法調用這些函數,因爲它可以將任何東西作爲模板傳遞,並且int或字符串或其他任何沒有loadFromFile( )。

我正在考慮用基類做模板specilaisation,但它會返回基類的指針,而不是派生的指針,除非我專門爲每一個派生類,但是我也可以沒有模板類,但是每個類型只需要一個資源管理器類。

那麼,有沒有什麼方法可以使用模板,並且具有調用派生類的功能的優點,同時仍然可以獲得基類的功能?

+0

如果您的模板調用類成員,那麼您將無法在沒有這些成員的類型上實例化模板。它不會編譯。 – sje397 2012-04-05 13:36:38

+0

我很難解析你的問題。你能否將一些問題域語言分解出來? – 2012-04-05 13:41:41

回答

1

如果您希望所有賦予您的類型都具有「loadFromFile()」方法,而不僅僅是在模板中使用此方法。如果有人會給你一個模板參數「int」,它就不會編譯,而據我所知,這是不錯的,這個人不應該這樣做。只需記錄您希望給予您的所有類型都具有的接口(例如「有一個loadFromFile()方法」)。

+0

好的,這似乎是最簡單的解決方案。 謝謝:)如果我有一個虛擬基類資源,實現所有我希望資源管理器調用的函數,然後確保所有派生類都覆蓋虛函數,那麼可以使用這些派生類中的任何一個資源管理器沒有編譯錯誤。 – jtedit 2012-04-05 13:49:33

+0

@jtedit如果在編譯時已知所有東西,則不需要使用虛擬方法的基類。在需要的地方使用虛擬方法(在當前時間或未來增強)。 – selalerer 2012-04-05 15:06:29

1

是的,可以將模板參數限制爲特定類的後代。 see this answer.

或者你可以保留它。無論如何,資源管理器將無法編譯不滿足所需接口的模板參數。