2013-04-14 3 views
0

대부분의 객체에 다른 객체에 대한 포인터가 있지만 객체를 소유하지 않은 객체 계층 구조에 대한 직렬화 해제 시나리오가 있습니다.컴파일시 포인터 유형에 대한 포인터 적용

  1. 객체가 생성됩니다,의 ID에 Register(Object* pObject) 에드는, 데이터를 읽어 :

    내가하는 두 단계의 프로세스를 구현하기 위해 노력하고 있습니다. 포인터 멤버는 고유 한 ID로 일련 번호가 지정되므로 다시 읽으면 I RegisterResolver(int id, Object** ppMember)가 반환됩니다.
  2. 리졸버가 처리됩니다. ID가 조회되고 올바른 주소가 *ppMember 인 주소에 쓰여집니다 (역 참조에주의하십시오).

문제는 :

  • 내가 등록 할 특정 Base 클래스 또는 파생 된 개체 만 포인터를 시행 할, 그러나 Derived**Base**로 변환 할 수 없습니다.
  • 나는 void* (안 void**) Derived**/Base**이 될 수 있음을 모두가 변환 사용하는 경우 모호성을 피하기 적어도 원하는,하지만 그렇게 할 수 Derived*/Base*. 다음 시나리오에서

: 인터페이스가 RegisterResolver(int id, void* ppObject) 경우

struct A: public Serialized 
{ 
    int blah; 
}; 

struct B: public Serialized 
{ 
    float fBlah; 
    A* pTarget; 
}; 

B myB; 

는 클라이언트 코드가 myB.pTarget 대신 &myB.pTarget의 통과하지 않는다고 보장 할 수 없습니다.

이 솔루션의 [유형] 안전성과 가독성을 개선하려면 어떻게해야합니까?

(대상 플랫폼은 x86 및 ARM 임)

답변

0

, 나는이 함께 Ben Voigt의 답변을 반복하고 결국했습니다

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

    // implementation 
} 
1

템플릿이 도움이됩니다. 어떻게 이런 일이 Derived*에서 Base*에 암시 적 변환이있는 모든 종류의 Derived**의 인수를 허용

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

에 대해. 원래 문제도 가독성에 관한 한 내가 인터페이스에 잠재적으로 혼란 매개 변수를 최소화하기 위해 원으로

관련 문제