Warum nicht im Standard?



  • Hi,

    da dEUs mal wieder eine Frage haben will, die nicht schon in der FAQ beantwortet ist, bitte:

    Warum ist sowas wie das folgende nicht im Standard? Ich nenne es hard_cast und es ändert einfach den Typ einer beliebigen Variable zu einem anderen der gleichen Größe, also quasi sowas wie reinterpret_cast nur nicht nur für Zeiger. Brauchen tut man das auch wenn's unsicher klingt (und auch ist) trotzdem oft, z.B. gibt's bei DirectX eine COM-Methode SetRenderState(), die nimmt als zweiten Parameter einen unsigned long, aber bei manchen Render States braucht sie einen float. Und da wird dann grad der float zum unsigned long hardgecasted und dort zurückgecasted...

    Meine Implementierung:

    template<class R, class T>
    R hard_cast(T t)
    {
    	return *reinterpret_cast<R*>(&t);
    }
    

    Nochmal, ja, das ist wirklich unsicher (obwohl beim const_cast und reinterpret_cast ähnliche Fehler passieren können), aber man braucht es in der Praxis wirklich hin und wieder, vor allem, aber nicht nur, beim Arbeiten mit älteren Bibliotheken. 🙂

    ChrisM



  • mir würde da

    reinterpret_cast<float&>(some_long) = 2.5;
    

    einfallen. Vielleicht klappt das ja sogar :p



  • Hi,

    reinterpret_cast<>() ist aber nur für Zeiger und nicht für Referenzen 🙂

    ChrisM



  • Ich hab jetzt keine Lust im Standard zu wühlen, aber Dev-C++ kann das.

    int main()
    {
      long p = 0x3F800000;
      cout << reinterpret_cast<float&>(p) << endl;
    }
    

    Ausgabe: 1



  • reinterpret_cast<>() ist aber nur für Zeiger und nicht für Referenzen

    Da tust du dich irren tun.

    Bashars Beispiel ist nach 5.2.10/10 erlaubt.



  • ... wobei das natürlich nicht 100% exakt das ist, was du willst, da es nur mit Lvalues funktioniert.



  • Nur mal eine Frage.
    Es soll in den Standart, das eine Klasse in eine andere gecasted wird.
    Dies ist doch so nicht ohne weiteres möglich, da es Unterschiede in der Fuktionalität gibt. Oder soll dies nur für normale Zahlenbereiche gehn?

    Es wäre natürlich toll, wenn mann dies machen könnte:

    Klasse_1 a;
    Klasse_2 b;
    
    b=(cast)a;
    


  • Das klappt nur dann, wenn die beiden Klassen verwand sind.



  • Ist mir schon klar.
    Deshalb gibt es ja auch soetwas nicht im Standart.



  • Es wäre natürlich toll, wenn mann dies machen könnte:

    Äh? Hallo?

    class GummiEnte
    {
    // ...
    };
    
    class AtomUBoot
    {
    // ...
    };
    
    class Terrorist
    {
    public:
        Terrorist(const GummiEnte& g)
        {
            AtomUBoot& u = (AtomUBoot&) g;
            u.killEmAll();
        }
    };
    

    Das wäre toll? Irgendwie hast du eine eigenartige Definition von toll 😃

    Mal ernsthaft:
    A a;
    B b;
    a = b;
    ist prinzipiell in C++ möglich. Nämlich genau dann, wenn der Autor von A einen Konstruktor zur Verfügung stellt, der ein B entgegen nimmt oder einen op= der ein B erwartet oder wenn der Autor von B einen Konvertierungsoperator nach
    A implementiert hat. Sprich genau dann, wenn die Konvertierung auf Anwendungslogischer-Sicht sinn macht und erwünscht wird.

    Auf einer anderen Ebene macht eine solche Konvertierung keinen sinn. Wozu sonst noch Konzepte über High-Level-Konstrukte wie Klassen repräsentieren? Da hantiert man dann doch besser einfach nur mit Speicher rum.



  • Etwas OT, aber Hume, wo bleibt ein Beispiel mit Elefant? 😃

    mfg
    v R


Anmelden zum Antworten