2015-06-25 36 views
7

chcę jakiś sposób napisać funkcję w Delphi jak na poniższymTestowanie typ rodzajowy w Delphi

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

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

znaczy: Chcę być w stanie robić różne rzeczy na podstawie typu rodzajowego

Próbowałem używać TypeInfo w System, ale wydaje się, że jest odpowiedni dla obiektów, a nie typów ogólnych.

Nie jestem nawet pewien, że to jest możliwe w Pascalu

+0

'GetTypeKind'should to zrobić. Zobacz http://delphisorcery.blogspot.de/2014/10/new-language-feature-in-xe7.html. –

+0

Możesz użyć wariantów? – whosrdaddy

Odpowiedz

6

TypeInfo powinno działać:

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

Od XE7 roku można użyć GetTypeKind znaleźć type kind:

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

Oczywiście tkFloat identyfikuje wszystkie rodzaje zmiennoprzecinkowych tak zobacz także test SizeOf(T) = SizeOf(double).

Starsze wersje Delphi nie mają wewnętrznej wartości GetTypeKind i zamiast tego należy użyć PTypeInfo(TypeInfo(T)).Kind. Zaletą modelu GetTypeKind jest to, że kompilator jest w stanie go ocenić i zoptymalizować gałęzie, których nie można wyselekcjonować.

Wszystko to jednak raczej psuje cel generyków i można się zastanawiać, czy twój problem ma lepsze rozwiązanie.

+2

FWIW Łączę się z dokumentem GetTypeKind, nawet jeśli nie jest to udokumentowane w nadziei, że pewnego dnia dokumentacja Emby nadrobi. –

+0

Oto informacje na temat GetTypeKind: http://stackoverflow.com/a/30417597/650492 – Johan

+0

Pamiętaj, że jeśli chcesz przetestować dla 'T jest podwójne \", to 'jeśli TypeInfo (T) = TypeInfo (podwójne) to ...' rozwiąże również wewnętrzne i nie wygeneruje żadnego kodu. – Johan