У меня есть сценарий десериализации для иерархии объектов, в которой большинство объектов содержат указатели на другие объекты, но не являются их владельцами.Выполнение указателя на тип указателя во время компиляции
Я пытаюсь реализовать двухступенчатый процесс, в котором:
- Объекты создаются,
Register(Object* pObject)
ред к ID, считываются данные. Элементы указателя сериализуются как уникальные идентификаторы, поэтому, читая их обратно, IRegisterResolver(int id, Object** ppMember)
. - Обработчики обработаны: идентификаторы просматриваются и правильный адрес записывается на адрес
*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.)