Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   generic cast? (https://www.delphipraxis.net/166760-generic-cast.html)

trashcandesign 28. Feb 2012 12:36

generic cast?
 
Moin,

ich wollte eine generic function zum casten von zwei Typen erstellen.
Mein Ansatz hierzu sieht so aus:

Code:
type
  mpCommon = class
  public
    class function mpCast<T, T2>(var Value : T) : T2;
  end;

implementation

class function mpCommon.mpCast<T, T2>(var Value : T) : T2;
begin
  try
    Result :=T2(Value);
  finally
  end;
end;
Allerdings bekomme ich hier ein Fehler "Ungültige Typumwandlung".
Geht das überhaupt mit Delphi?

himitsu 28. Feb 2012 12:53

AW: generic cast?
 
Das ist ein großes Problemchen der Generics.
Sowas ist einfach nicht möglich.

Die Generics werden am Anfang geparst, wo auch schon gewissen Prüfungen vorgenommen werden und da zu diesem Zeitpunkt noch keine genauen Typen feststehen, kann hier auch kein derartiger Cast damit aufgebaut werden.

Wenn die Typen bitkompatibel sind, dann gäbe es einen Weg (über Pointer), aber da dort dann kein "automatisch" Typecast genutzt werden kann, wie z.B. AnsiString<>WideString oder Byte<>Integer, würde ich von soeiner Funktion abraten, da dieses die Speicherverqaltung schnell mal zerschießen kann.
Oder man implementiert alle Konverter und Kopieroperationen selber, welche dann über die TypeInfo (RTTI) verwaltet und entsprechend ausgeführt werden müßten.

Wenn dir derartige Casts ausreichen und du noch etwas Zeit hast dann hätte ich womöglich was für dich.
Delphi-Quellcode:
  T<TType> = record
    class function ToStr (const Value: TType):  string;
    class function FromStr(const Value: string): TType;

    class function ToInt (const Value: TType):  Integer;
    class function FromInt(const Value: Integer): TType;

    class function ToBin (const Value: TType):  Binary; // array of byte
    class function FromBin(const Value: Binary): TType;

    class function ToHex (const Value: TType):  string;
    class function FromHex(const Value: string): TType;
  end;
PS: Das wird intern fast alles über TValue aus der Unit RTTI gehandhabt.
Vielleicht bis übernächstes Wochenende, da ich Dieses wohl noch zu tun hab.
Die To-Funktionen sind schon seit 3 Wochen fertig, mit allen Grundtypen wie Integer, String, Enum und Set, aber beim Rest hing ich etwas, da es nicht nativ über TValue möglich ist, und dann war was Anderes dazwischengekommen.

jaenicke 28. Feb 2012 13:07

AW: generic cast?
 
Die Frage ist doch bezogen auf die ursprüngliche Frage eher warum man das machen wollen würde. Ich meine casten an sich geht ohne Generics viel einfacher.

Wenn es um Typumwandlungen geht, sieht das natürlich anders aus, das macht mehr Sinn. Dafür wiederum gibt es ja in der Unit Rtti TValue und dort TryCast usw., wo diverse Umwandlungen schon möglich sind.

mkinzler 28. Feb 2012 13:23

AW: generic cast?
 
Ich würde versuchen, das Problem mit Hilfe der class operator Implizit/Explizit zu lösen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:14 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz