2011-08-19 15 views
1

我目前正面臨處理模板類的問題。在基本代碼我目前正與我們一行是這樣的: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>的單個指針。所以我必須要麼

  1. 有兩個導入此寄存器的類的副本,一個處理uint32_t的類型和一個處理uint64_t類型的類。這個解決方案顯然很糟糕,因爲代碼重複。
  2. 對導入此註冊表的類進行模板化。在理想的世界中,這可能是正確的解決方案,但它並不真正適合「正常的做事方式」,其他同事可能更喜歡複製和粘貼而不是模板化這種類型的課程。
  3. 製作一個適配器。子類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 
 

有沒有更好的解決辦法了嗎?一些我不知道的設計模式?

+2

爲什麼你的平臺的性能不穩定? – MSN

+0

看起來有人在'static_cast'之後吃了你的源代碼塊。無論如何...這是一個非常奇怪的問題。爲什麼你必須記住一個值是32位還是64位?如果它是一個運行時變量,它應該是'Register'的數據成員,而不是模板參數。 – Potatoswatter

+0

如果'importItemPtr(someGlobalIdString)'返回了正確的類型,而不需要強制轉換,會不會更好?這也可以解決你的問題。 –

回答

0

嘗試使用Bridge模式,其中Implementor是常見操作的集合,專業化是ConcreteImplementors。

http://en.wikipedia.org/wiki/Bridge_pattern

也許不是最好的解決辦法(過度設計),所以請在使用前對其進行分析。