boost:::variant<> fuer C++/CLI .NET? (oder sowas in der Art)



  • Wäre es nicht geil, wenn man sich das ganze rumcasten sparen könnte und das per Pattern Matching erledigen könnte?



  • Beim einem .net Programm kommt es zu einer einer Exception wegen eines falschen Casts. Das Programm fängt sie nicht ab das es sich nicht selbst patchen kann. Danach beendet die .NET Runtime das Programm aufgrund einer ungefangen Ausnahme.

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-171928.html



  • [edit] total am Thema vorbei [/edit]



  • Ben04 schrieb:

    Hättest du dir die Dokumentation von boost::any angeschaut (etwa 4 lesbar formatierte Seiten inklusive Reference) wüsstest du, dass dies auch mit boost::any möglich ist.

    Hab ich doch nie abgestritten... Aber: Du kannst dann trotzdem noch wild casten wie Du willst ohne dass es jemand prüft! boost::any ist nix in der Sprache oder dem Compiler eingebautes Feature! Das ist der entscheidende Unterschied...



  • Jochen Kalmbach schrieb:

    Aber: Du kannst dann trotzdem noch wild casten wie Du willst ohne dass es jemand prüft!

    Blödsinn. Wie soll das gehen? Man kann auf boost::any nur mit den any_cast-Funktionen zugreifen. Und die sind so sicher wie dynamic_cast, also sehr.



  • (some_type*) any_var; !? bzw. static_cast !?



  • Knuddlbaer schrieb:

    Beim einem .net Programm kommt es zu einer einer Exception wegen eines falschen Casts. Das Programm fängt sie nicht ab das es sich nicht selbst patchen kann. Danach beendet die .NET Runtime das Programm aufgrund einer ungefangen Ausnahme.

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-171928.html

    http://msdn2.microsoft.com/en-us/library/ms680634.aspx
    SetUnhandledExceptionFilter

    Kann man also genau so gut in einem native Programmen machen. Der Grund warum der Standard da nichts vorschreibt ist ganz einfach : Diese Funktion ist sinnlos.

    Helium schrieb:

    Wäre es nicht geil, wenn man sich das ganze rumcasten sparen könnte und das per Pattern Matching erledigen könnte?

    Hängt von der Situation ab, allerdings von Zeit zu Zeit wäre das wirklich geil. boost::variant ist da recht flexibel solange es nur um den statischen Type geht.

    (some_type*) any_var; !? bzw. static_cast !?

    Geht vielleicht wenn der Compiler ganz lieb ist aber eher nicht. static_cast darf nicht gehen. Mit C-Casts aber zu begründen, dass eine Sprache unsicher ist, ist aber auch schon sehr schwach. Man muss sich ja nur sehr wenig vertippen und schon wurde

    boost::any_cast<Derived*>(&my_any)
    

    zu

    (Derived*)my_any
    

    Unwissentlich nutzt man C-Casts nicht.



  • Jochen Kalmbach schrieb:

    (some_type*) any_var; !? bzw. static_cast !?

    Das geht nicht. Meckert der Compiler an.

    boost::any x,y;
    x=4;
    y=4.2;
    int a = boost::any_cast<int>(x);//geht
    int a1 = boost::any_cast<int>(y);//wirft eine exception
    int b = *(int*)x;//geht nicht
    int c = *(int*)&x;//compiliert, wird aber garbage ergeben
    

    boost::any ist absolut sicher.



  • Wir wollen nicht diskutieren, wie sicher oder unsicher boost::any ist, sondern ein boost::variant-equivalent nachbauen.



  • Helium schrieb:

    Wir wollen nicht diskutieren, wie sicher oder unsicher boost::any ist, sondern ein boost::variant-equivalent nachbauen.

    Wozu? Man kann boost::variant und boost::any doch auch unter C++/CLI verwenden?!


Anmelden zum Antworten