![]() |
Delphi-Version: 2010
generischen Typen als "irgendeinen" String-Typen deklarieren
Delphi-Quellcode:
type
TMyClass = class procedure Test<typ>(S: typ); end; procedure TMyClass.Test<typ>(S: typ); var S2: String; begin S2 := S; <<< end; Zitat:
Man kann zwar z.B. so
Delphi-Quellcode:
sagen, daß es irgendeine Klasse sein wird,
procedure Test<typ: class>(S: typ);
aber wie kann man es zum String kompatibel machen? (AnsiString, RawByteString, UnicodeString, String) Ich wollte die Generics benutzen, um einige "ähnliche" Funktionen zu kombinieren. Wobei sich dort nur ein paar Parameter so unterscheiden, daß sie einmal ANSI und dann auch mal als Unicode vorhanden sein können. Da es einige Funktionen mit bis zu 3 String-Parametern gibt und ich absolut nicht die automatischen Stringumwandlungen, seitens Delphi, gebrauchen kann, gibt es da also öfters mal bis zu 3^3 = 9 Funktionen, welche alle fast den selben Inhalt besitzen. |
AW: generischen Typen als "irgendeinen" String-Typen deklarieren
Die Vereinfachung, welche Du mit Generics erreichen möchtest, funktioniert leider nicht aufgrund des nicht vorhandenen Typsystems bzw. der nicht vorhandener Contraints für Stringtypen. Um die Verwendung von überladenen Methoden wirst Du leider nicht drumherum kommen.
Theoretisch könntest Du es analog zu folgendem Beispiel implementieren:
Delphi-Quellcode:
Der Output müsste so aussehen:
program ParameterizedStringMethodTest;
{$APPTYPE CONSOLE} type TMyClass = class class procedure Test<T>(S: T); end; T1252String = type AnsiString(1252); class procedure TMyClass.Test<T>(S: T); var StringTypeInfo: Pointer; begin StringTypeInfo := TypeInfo(T); if StringTypeInfo = TypeInfo(AnsiString) then WriteLn('AnsiString: ' + AnsiString(Pointer(@S)^)) else if StringTypeInfo = TypeInfo(RawByteString) then WriteLn('RawByteString: ' + RawByteString(Pointer(@S)^)) else if StringTypeInfo = TypeInfo(UnicodeString) then WriteLn('UnicodeString: ' + UnicodeString(Pointer(@S)^)) else if StringTypeInfo = TypeInfo(ShortString) then WriteLn('ShortString: ' + ShortString(Pointer(@S)^)) else if StringTypeInfo = TypeInfo(UTF8String) then WriteLn('UTF8String: ' + UTF8String(Pointer(@S)^)) else if StringTypeInfo = TypeInfo(T1252String) then WriteLn('T1252String: ' + T1252String(Pointer(@S)^)) else WriteLn('Unknown type'); end; begin TMyClass.Test(AnsiString('Ansi')); TMyClass.Test(RawByteString('Raw')); TMyClass.Test(UnicodeString('Uni')); TMyClass.Test(string('string is Uni too')); TMyClass.Test(ShortString('Short')); TMyClass.Test(UTF8String('UTF8')); TMyClass.Test(T1252String('1252')); ReadLn; end.
Code:
AnsiString: Ansi
RawByteString: Raw UnicodeString: Uni UnicodeString: string is Uni too ShortString: Short UTF8String: UTF8 T1252String: 1252 |
AW: generischen Typen als "irgendeinen" String-Typen deklarieren
Zitat:
|
AW: generischen Typen als "irgendeinen" String-Typen deklarieren
Ich habe aber Strings und keine Objekte.
Aktuell umgeh ich den Compiler über wilde Pointervergewaltigungen und blöde IF-Kontrukte, wobei mir {$IF lieber wäre :cry: Es wäre schön, wenn es wirklich endlich mal einen zweifasigen Compiler gäbe und dieser erst die Typenprüfungen macht, wenn er einen Typen übergeben bekommt. |
AW: generischen Typen als "irgendeinen" String-Typen deklarieren
Zitat:
|
AW: generischen Typen als "irgendeinen" String-Typen deklarieren
@Uwe :thumb:
[ot] ...ist hier etwa Weibsvolk anwesend ? Ps. Ich liebe diesen Film! |
AW: generischen Typen als "irgendeinen" String-Typen deklarieren
So, fast alle Arbeit umsonst.
Mein Fazit: Für eine gleichzeitige Ansi/Unicode-Programmierung ist diese besch** Generic-Implementierung absolut nicht zu gebrauchen. Danke Emba, für eure tolle Arbeit. |
AW: generischen Typen als "irgendeinen" String-Typen deklarieren
Dazu ist sie eigentlich auch nicht gedacht
|
AW: generischen Typen als "irgendeinen" String-Typen deklarieren
Mal ehrlich, vergiss den ganzen AnsiKrams und benutz string und fertig. Wer dennoch was nicht Unicode kompatibles haben will solls halt erst in string umcasten und in deine Methoden reingeben.
|
AW: generischen Typen als "irgendeinen" String-Typen deklarieren
Das ist eine Bibliothek, welche mit Ansi, UTF-8 und Co. umgehen können muß.
Da gibt es keinen anderen Weg. Wenn ich dieses nur als "String" (Unicode) auslege, dann müssen "extern" Stringumwandlungen vorgenommen werden und das erzeugt zusätzliche Fehlerquellen. Es gibt schon seine Grüne, warum ich seit Monaten versuche hierfür eine Ansi/Unicode-kompatible Schittstelle hinzubekommen. Über die Generics hatte ich mir hier (intern) ein paar Vereinfachungen erhofft, in Form von knapp 1000-2000 Zeilen Quellcode, aka knapp 1/4 bis 1/3 eingesparten "doppelten" Code. Nja, knapp 2-3 Tage umsonst dahingegangen, wärend ich versuchte die Generics passend hinzubiegen und dann scheiterte es an Compilerfehlern. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz