AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

generic cast?

Ein Thema von trashcandesign · begonnen am 28. Feb 2012 · letzter Beitrag vom 28. Feb 2012
Antwort Antwort
trashcandesign

Registriert seit: 21. Feb 2006
Ort: Mühlhausen
187 Beiträge
 
Delphi XE2 Professional
 
#1

generic cast?

  Alt 28. Feb 2012, 13:36
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?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

AW: generic cast?

  Alt 28. Feb 2012, 13:53
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.
$2B or not $2B

Geändert von himitsu (28. Feb 2012 um 13:58 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: generic cast?

  Alt 28. Feb 2012, 14:07
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.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: generic cast?

  Alt 28. Feb 2012, 14:23
Ich würde versuchen, das Problem mit Hilfe der class operator Implizit/Explizit zu lösen.
Markus Kinzler
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:09 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