2009-02-04 22 views
5

Bu benim ilk sorum burada, bu siteyi bulduğum için mutluyuz.Genel parametre türüne işaretçi nasıl kullanılır?

Sorgu, Delphi 2009'daki yeni Generics özelliği ile ilgilidir. Temel olarak, mevcut bir karma harita uygulaması için genel bir sarmalayıcı sınıfı yazmaya çalıştım. Var olan uygulama depoları (String, Pointer) çiftleri, bu yüzden sarmalayıcı sınıfında, T ve Pointer tipi jenerik parametre ve tam tersi arasında döküm yapmak zorundayım. (Değer: T)

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

end; 

Böyle bir döküm düşünce

Value := (TObject (Ptr)) as T 

Ancak bu işe yaramaz. Derleyici bana 'İşletmecinin bu işlenen türüne uygun olmadığını' söylüyor.

Birileri bazı ipuçları var? Şimdiden çok teşekkürler.

cevap

10

Genel tip parametre tipinin adresini almanız, sonra bu adresi bir işaretçiye istenen türde yazmanız ve sonra bu işaretçiyi işaretleyip int o ortaya çıkan yer. Örneğin:

PObject(@Value)^ := Ptr; 

sadece T ulaştırma türüdür tipi T, değerini typecasting edilemez nedeni derleyici T boyutunu bilmek olmamasıdır; normal olarak, sayısal olmayan tahminler yalnızca değerleri aynı boyutta olan türlere dönüştürebilir.

Ne yazık ki, derleyici, sınıf tipi bir kısıtlamanın, T işaretçisiyle aynı boyutta olması garantilendiği anlamına gelmek için yeterince akıllı değildir.

Ayrıca, mevcut Delphi 2009 jenerikleriyle, parametre türlerini yazmak için işaretçiler oluştururken bir sorun var. Jenerik işaretçileri derleyici tarafından desteklenmez, ancak derleyici izinleri bu sözdizimi iç sınıfları:

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

Bu belli senaryolar için çalışabilir - ve Özgül sorun yararlı olabilir - ama sadece kazara çalışır ve değil genellikle desteklenir. Kendi sorumluluğunuzda kullanın.

0

bu deneyin:

Value := TObject (Ptr) 

Gerek genel sınıf tipi değişkene TObject atama gibi, daha atmak :)

geçerlidir Ama T kullanamazsınız neden nedenini bilmiyorum ilk etapta döküm için ...

İlgili konular