c++ - 在编译时强制指针指向指针类型

标签 c++ pointers readability type-safety

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

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

  1. 创建对象,Register(Object* pObject)编到一个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;

如果接口(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/

相关文章:

c++ - 使用样式表更改索引 QTabBar 选项卡的背景

c++ - 如何为变量使用别名?

c - 数组已填充最后一个元素

javascript - 如何将当前范围传递给函数引用?

javascript - 在线阅读服务?

c++ - 程序退出不整齐 : MFC C++

c++ - 整数决定论

从指针复制地址

c - 从 C 中的指针列表中设置指针内容

C++如何重用具有多个返回(退出点)的代码块?