2013-04-14 2 views
0

У меня есть сценарий десериализации для иерархии объектов, в которой большинство объектов содержат указатели на другие объекты, но не являются их владельцами.Выполнение указателя на тип указателя во время компиляции

Я пытаюсь реализовать двухступенчатый процесс, в котором:

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

ответ

0

Поскольку оригинальный вопрос также относительно читаемости, и я хотел, чтобы свести к минимуму потенциально запутанные параметры на интерфейсе, я итерация на ответ Ben Voigt «s и в конечном итоге с этим:

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

    // implementation 
} 
1

Шаблон должен помочь. Как насчет

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

Это позволяет аргумент любого типа Derived**, для которого существует неявное преобразование из Derived* в Base*.