我目前正面臨處理模板類的問題。在基本代碼我目前正與我們一行是這樣的:C++中的模板「適配器」
Register<uint32_t>* myReg = static_cast<Register<uint32_t>*>(importItemPtr(someGlobalIdString));
其中importItemPtr負責從基於標識字符串一些全局集合返回一個void *到項目中。
問題是此代碼現在將運行在某個平臺上,someGlobalIdString引用的對象將不再是Register<uint32_t>
類型,而是Register<uint64_t>
。這是必須在運行時做出的決定。由於我使用的是模板化類型,我無法使用指向Register<uint32_t>
或Register<uint64_t>
的單個指針。所以我必須要麼
- 有兩個導入此寄存器的類的副本,一個處理uint32_t的類型和一個處理uint64_t類型的類。這個解決方案顯然很糟糕,因爲代碼重複。
- 對導入此註冊表的類進行模板化。在理想的世界中,這可能是正確的解決方案,但它並不真正適合「正常的做事方式」,其他同事可能更喜歡複製和粘貼而不是模板化這種類型的課程。
- 製作一個適配器。子類
Register<uint64_t>
創建一個接受Register<uint32_t>
作爲構造函數的新類,基本上只是包裝該寄存器並返回64位值而不是32.重寫消費類以始終使用64位版本,並且當我們位於提供32位版本只是包裝它。上面的代碼段會是這個樣子:
適配器:
class Reg32to64Adapter : public Register<uint64_t> { ... }
消費類:
Register* myReg;
if(is32bitPlatform)
{
Register* my32Reg = static_cast*>(importItemPtr(someGlobalIdString));
myReg = new Reg32to64Adapter(my32Reg);
}else
{
myReg = static_cast*>(importItemPtr(someGlobalIdString));
}
//Go on manipulating myReg
有沒有更好的解決辦法了嗎?一些我不知道的設計模式?
爲什麼你的平臺的性能不穩定? – MSN
看起來有人在'static_cast'之後吃了你的源代碼塊。無論如何...這是一個非常奇怪的問題。爲什麼你必須記住一個值是32位還是64位?如果它是一個運行時變量,它應該是'Register'的數據成員,而不是模板參數。 – Potatoswatter
如果'importItemPtr(someGlobalIdString)'返回了正確的類型,而不需要強制轉換,會不會更好?這也可以解決你的問題。 –