2009-02-04 2 views
5

이곳이 내 첫 번째 질문입니다.이 사이트를 발견하게 된 것을 기쁘게 생각합니다.일반 매개 변수 유형에 대한 포인터를 캐스팅하는 방법은 무엇입니까?

제 질문은 Delphi 2009의 새로운 Generics 기능에 대한 것입니다. 기본적으로 기존 해시 맵 구현을위한 일반 래퍼 클래스를 작성하려고했습니다. 기존 구현에서는 (String, Pointer) 쌍을 저장하므로 래퍼 클래스에서 일반 매개 변수 유형 T와 포인터 유형간에 캐스팅해야하며 반대의 경우도 마찬가지입니다. (값 : T)

type THashMap <T : class> = class 
private 
    FHashList : THashList; 
    ... 

end; 

나는 이런 캐스트 생각

Value := (TObject (Ptr)) as T 

하지만이 작동하지 않습니다. 컴파일러에서 '이 연산자 유형에 적용 할 수없는 연산자'라고 알려줍니다.

누군가 힌트가 있습니까? 많은 감사드립니다.

답변

10

일반 유형 매개 변수 유형의 위치 주소를 가져 와서이 주소를 원하는 유형의 포인터로 유형 변환 한 다음이 포인터를 역 참조하고 int를 할당해야합니다 o 결과 위치. 예를 들어 :

PObject(@Value)^ := Ptr; 

그냥 T는 제약 인 타입 T의 값을 캐스트 할 수없는 이유, 컴파일러는 T의 크기를 알 수 없다는 것입니다; 일반적으로 숫자가 아닌 타입 변환은 값을 같은 크기의 타입으로 변환 할 수 있습니다.

컴파일러는 클래스 유형 제약 조건이 T가 포인터와 동일한 크기로 보장된다는 것을 알기에 충분히 똑똑하지 않습니다.

또한 입력 매개 변수 유형에 대한 포인터를 만드는 데있어 현재 Delphi 2009 제네릭에 문제가 있습니다. 일반 포인터는 컴파일러에 의해 지원되지 않지만 컴파일러 허용이 구문 내부 클래스 :

type 
    C<T> = class 
    type 
    PT = ^T; // UNSUPPORTED! 
    end; 

이 특정 시나리오에서 작동 할 수 - 당신의 특정 문제에 대한 도움이 될 수 있습니다 -하지만 그것은 단지 사고에 의해 작동이되지 않습니다 일반적으로 지원됩니다. 자신의 책임하에 사용하십시오.

0

이 시도 :

Value := TObject (Ptr) 

필요 없음을 일반 클래스 형 변수에 TObject 할당으로, 더 캐스팅하기 :

유효하지만 T을 사용할 수없는 이유는 이유를 모른다 첫 번째 위치에 주조를 위해 ...

관련 문제