2013-04-14 32 views
0

我有一個對象層次結構的反序列化場景,其中大多數對象包含指向其他對象的指針,但不擁有它們。在編譯時強制指針指針類型

我試圖實現一個兩步過程,其中:創建

  1. 對象,Register(Object* pObject)編到的ID,數據被讀出。指針成員被序列化爲唯一的ID,因此在讀取它們後,我會RegisterResolver(int id, Object** ppMember) s。
  2. 處理解析器:查找ID並將正確的地址寫入地址*ppMember(注意取消引用)。

問題:

  • 欲執行,只有指針的或派生的對象從某一Base類被註冊,但是Derived**不能轉換到Base**
  • 至少避免歧義使用void*(未void**),該Derived**/Base**既可以是轉換爲的情況下,但那麼可以Derived*/Base*

在以下情形:

struct A: public Serialized 
{ 
    int blah; 
}; 

struct B: public Serialized 
{ 
    float fBlah; 
    A* pTarget; 
}; 

B myB; 

如果接口RegisterResolver(int id, void* ppObject),有沒有保證,客戶端代碼不會通過的myB.pTarget代替&myB.pTarget

如何提高此解決方案的[類型]安全性和可讀性?

(目標平臺是x86和ARM。)

回答

0

由於原來的問題也涉及可讀性,我想,以儘量減少在界面上可能混淆的參數,我反覆對Ben Voigt的答案,並結束了與此:

template<typename T> 
void RegisterResolver(int id, T** ppObject) 
{ 
    // assert(ppObject != 0); 
    Base* pBase(*ppObject); // not used 

    // implementation 
} 
1

模板應該有所幫助。如何

template<typename T> 
void RegisterResolver(int id, T** ppObject, Base* extra = (T*)0); 

這允許任何類型Derived**對此有從Derived*Base*的隱式轉換的參數。