我有一个对象层次结构的反序列化场景,其中大多数对象包含指向其他对象的指针,但不拥有它们。
我正在尝试实现一个两步流程,其中:
- 创建对象,
Register(Object* pObject)
编到一个ID,数据被读取。指针成员被序列化为唯一 ID,因此在读回它们时,我RegisterResolver(int id, Object** ppMember)
s. - 处理解析器:查找 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;
如果接口(interface)是RegisterResolver(int id, void* ppObject)
, 不能保证客户端代码不会通过 myB.pTarget
而不是 &myB.pTarget
.
我可以做些什么来提高此解决方案的 [type-] 安全性和可读性?
(目标平台是x86和ARM。)
最佳答案
模板应该有所帮助。怎么样
template<typename T>
void RegisterResolver(int id, T** ppObject, Base* extra = (T*)0);
这允许任何类型的参数 Derived**
对于 Derived*
有一个隐式转换至 Base*
.
关于c++ - 在编译时强制指针指向指针类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16005709/