在编译时强制指针指向指针类型
Enforcing pointer to pointer type at compile time
我有一个对象层次结构的反序列化场景,其中大多数对象包含指向其他对象的指针,但不拥有它们。
我正在尝试实现一个两步过程,其中:
- 对象创建,
Register(Object* pObject)
ed为ID,读取数据。指针成员被序列化为唯一的id,因此在读取它们时,IRegisterResolver(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;
如果接口是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
}
相关文章:
- C++中的双指针类型转换
- C++默认情况下,指针类型数组的元素是否保证初始化为 nullptr?
- 将类指针类型转换为键时出错
- 错误:表达式必须具有算术、无作用域枚举或带有运算符重载的指针类型
- C++在一个映射中存储不同的指针类型(并处理销毁)
- 指针类型类成员的动态强制转换的恒定性是什么?
- 我正在尝试将表的地址传递给要在另一个函数中使用的指针,但得到不兼容的指针类型
- 在将派生类指针类型转换为派生类指针后,从基类指针调用派生类函数
- 如何使用静态多态性在 int 和指针类型之间进行转换?
- STL 函数和函数类型与函数指针类型
- 如何调用指针类型的方法(禁用多态性)?
- 为什么新表达式可以正确生成指针类型,即使它应该返回 void*?
- 对于非常量指针类型的参数,未调用具有常量指针模板类型参数的功能
- 是否允许调用方对我的 Builder 类使用任何指针类型(包括智能指针)?
- OPENCL 警告:不兼容的指针类型将'float __global[16]'传递给类型为 '__global float4 的参数 *
- 专门用于"direct"函数类型(与函数指针类型相对)
- 指向成员的指针类型和模板
- 返回对常量结构(指针类型)成员的引用:明显的左值到右值转换
- 在C++17中,为什么类模板和函数模板的指针类型推导明显不一致
- 为什么允许将整型、枚举和指向成员的指针类型reinterpret_cast到自身?