在编译时强制指向指针类型的指针

问题描述 投票:0回答:2

我有一个对象层次结构的反序列化场景,其中大多数对象包含指向其他对象的指针,但不拥有它们。

我正在尝试实施一个两步过程,其中:

  1. 创建对象,Register(Object* pObject)ed为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。)

c++ pointers readability type-safety
2个回答
1
投票

模板应该有所帮助。怎么样

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

这允许任何类型的Derived**的参数,其中存在从Derived*Base*的隐式转换。


0
投票

由于最初的问题也与可读性有关,我想尽量减少界面上可能令人困惑的参数,我已经迭代了Ben Voigt的答案并最终得到了这个:

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

  // implementation
}
© www.soinside.com 2019 - 2024. All rights reserved.