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