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

Enforcing pointer to pointer type at compile time

本文关键字:指针 类型 编译      更新时间:2023-10-16

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

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

  1. 对象创建,Register(Object* pObject) ed为ID,读取数据。指针成员被序列化为唯一的id,因此在读取它们时,I 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

我能做些什么来提高[type-]的安全性和可读性?

(目标平台是x86和ARM)

模板应该会有所帮助。

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

允许从Derived*Base*进行隐式转换的任何类型Derived**的实参

由于最初的问题也涉及可读性,并且我想尽量减少界面上可能令人困惑的参数,因此我对Ben Voigt的答案进行了迭代,并以以下内容结束:

template<typename T>
void RegisterResolver(int id, T** ppObject)
{
  // assert(ppObject != 0);
  Base* pBase(*ppObject); // not used
  // implementation
}
相关文章: