2015-06-25 21 views
7

voglio un modo per scrivere una funzione in Delphi come seguenteTestare il tipo di un generico in Delphi

procedure Foo<T>; 
begin 
    if T = String then 
    begin 
     //Do something 
    end; 

    if T = Double then 
    begin 
     //Do something else 
    end; 
end; 

vale a dire: io voglio essere in grado di fare cose diverse in base a un tipo generico

Ho provato a utilizzare TypeInfo in System ma questo sembra essere adatto agli oggetti piuttosto che ai tipi generici.

io non sono nemmeno sicuro che questo è possibile in pascal

+0

'GetTypeKind'should fare questo. Vedi http://delphisorcery.blogspot.de/2014/10/new-language-feature-in-xe7.html. –

+0

È possibile utilizzare le varianti? – whosrdaddy

risposta

6

TypeInfo dovrebbe funzionare:

type 
    TTest = class 
    class procedure Foo<T>; 
    end; 

class procedure TTest.Foo<T>; 
begin 
    if TypeInfo(T) = TypeInfo(string) then 
    Writeln('string') 
    else if TypeInfo(T) = TypeInfo(Double) then 
    Writeln('Double') 
    else 
    Writeln(PTypeInfo(TypeInfo(T))^.Name); 
end; 

procedure Main; 
begin 
    TTest.Foo<string>; 
    TTest.Foo<Double>; 
    TTest.Foo<Single>; 
end; 
10

Da XE7 in poi è possibile utilizzare GetTypeKind per trovare le type kind: tutti i tipi in virgola mobile

case GetTypeKind(T) of 
tkUString: 
    .... 
tkFloat: 
    .... 
.... 
end; 

Naturalmente tkFloat identifica per cui si potrebbe anche test SizeOf(T) = SizeOf(double).

Le versioni precedenti di Delphi non hanno l'intrinseco GetTypeKind e devi invece utilizzare PTypeInfo(TypeInfo(T)).Kind. Il vantaggio di GetTypeKind è che il compilatore è in grado di valutarlo e di ottimizzare i rami lontani che è possibile dimostrare di non essere selezionati.

Tutto ciò sconfigge lo scopo dei generici e ci si chiede se il problema abbia una soluzione migliore.

+2

FWIW Ho collegato al documento GetTypeKind anche se non è documentato nella speranza che un giorno i documenti Emba si aggiorneranno. –

+0

Ecco le informazioni su GetTypeKind: http://stackoverflow.com/a/30417597/650492 – Johan

+0

Si noti che se si desidera verificare che 'T sia double', allora' se TypeInfo (T) = TypeInfo (double) then ... ' risolverà anche in un intrinseco e non genererà alcun codice. – Johan