我有一个对象层次结构的反序列化场景,其中大多数对象包含指向其他对象的指针,但不拥有它们。
我正在尝试实施两步流程:
Register(Object* pObject)
到ID,读取数据。指针成员被序列化为唯一ID,因此在阅读它们时,我RegisterResolver(int id, Object** ppMember)
s。*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 :(得分:1)
模板应该有所帮助。 <怎么样
template<typename T>
void RegisterResolver(int id, T** ppObject, Base* extra = (T*)0);
这允许任何类型Derived**
的参数,其中存在从Derived*
到Base*
的隐式转换。
答案 1 :(得分:0)
由于最初的问题也与可读性有关,我想最大限度地减少界面上可能令人困惑的参数,我已经迭代了Ben Voigt的答案并最终得到了这个:
template<typename T>
void RegisterResolver(int id, T** ppObject)
{
// assert(ppObject != 0);
Base* pBase(*ppObject); // not used
// implementation
}