2015-06-25 14 views
7

möchte ich irgendwie eine Funktion in delphi wie folgtden Typ eines generischen in delphi Testen

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

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

also schreiben: I auf einem generischen Typ basiert verschiedene Dinge zu tun in der Lage sein wollen

Ich habe versucht, TypeInfo in System zu verwenden, aber dies scheint für Objekte und nicht für generische Typen geeignet sein.

Ich bin nicht einmal sicher, dass dies in pascal

+0

'GetTypeKind'should dies tun. Siehe http://delphisorcery.blogspot.de/2014/10/new-language-feature-in-xe7.html. –

+0

Sie können Varianten verwenden? – whosrdaddy

Antwort

6

TypeInfo sollte funktionieren:

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

Von XE7 möglich ist, weiter können Sie GetTypeKind verwenden, um die type kind zu finden:

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

Natürlich tkFloat identifiziert alle Gleitkommatypen so könnten Sie auch Test SizeOf(T) = SizeOf(double).

Ältere Versionen von Delphi haben nicht die GetTypeKind intrinsische und Sie müssen stattdessen PTypeInfo(TypeInfo(T)).Kind verwenden. Der Vorteil von GetTypeKind ist, dass der Compiler in der Lage ist, diese auszuwerten und Zweige zu optimieren, die nachweislich nicht ausgewählt werden.

All dies widerspricht eher dem Zweck von Generika und man fragt sich, ob Ihr Problem eine bessere Lösung hat.

+2

FWIW Ich bin mit GetTypeKind doc verlinkt, obwohl es nicht in der Hoffnung dokumentiert ist, dass die Emba Docs eines Tages aufholen werden. –

+0

Hier finden Sie Informationen zu GetTypeKind: http://Stackoverflow.com/a/30417597/650492 – Johan

+0

Beachten Sie, dass, wenn Sie für 'T double' testen möchten,' 'wenn TypeInfo (T) = TypeInfo (double) dann ...' wird auch zu einem intrinsischen auflösen und keinen Code erzeugen. – Johan