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

时间:2013-04-14 23:53:07

标签: c++ pointers readability type-safety

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

我正在尝试实施两步流程:

  1. 创建对象,Register(Object* pObject)到ID,读取数据。指针成员被序列化为唯一ID,因此在阅读它们时,我RegisterResolver(int id, Object** ppMember) s。
  2. 处理解析器:查找ID并将正确的地址写入*ppMember的地址(注意取消引用)。
  3. 问题:

    • 我想强制只注册指向某个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。)

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

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

  // implementation
}
相关问题