boost:::variant<> fuer C++/CLI .NET? (oder sowas in der Art)
-
Jochen Kalmbach schrieb:
Jan I. Tor schrieb:
Bitte nicht mit Vererbung und Basis-klassen-zeiger kommen
Was willst Du dann genau???????????????????????????????????????
boost::variant<int, std::string, double>
Das will er. Nur eben für doofes C++/CLI.
-
Jochen Kalmbach schrieb:
Jan I. Tor schrieb:
Bitte nicht mit Vererbung und Basis-klassen-zeiger kommen
Was willst Du dann genau?[...]?
Ich kann halt nicht eine Klasse Vererben wenn es kein Sinn macht, oder?
Jochen Kalmbach schrieb:
PS: Mische bitte nicht *unbeabsichtigt* .NET (C++/CLI) und native Code!!!
Das habe ich doch vor.
-
Boost Variant implementiert doch auch nur einfach das Visitor Pattern das man eigentlich so gut wie nie brauch, oder?
Des gibts natürlich auch in .NetWobei ich zumindest das Motivating Sample ziemlich sinnlos finde. Z.b.
int result = boost::apply_visitor( my_visitor(), u );
Warum nicht gleich einfach ne Funktion auf das Objekt anwenden?
Vielleicht bin ich aber auch einfach zu unerfahren in C++
-
Jan I. Tor schrieb:
Ich kann halt nicht eine Klasse Vererben wenn es kein Sinn macht, oder?
Das verstehe ich nicht ganz.... was willst Du wihin vererben???
In .NET ist *alles* von "Object* abgeleitet, deswegen ist dieser Datentyp in *jedem* .NET-typ enthalten...Also ich verstehe immer noch nicht was Du willt... und was Dir bei "Object^" fehlt...
-
Jochen Kalmbach schrieb:
und was Dir bei "Object^" fehlt...
Typsicherheit? Ich gebe ja zu, das Variants / Discriminated Unions ohne Pattern Matching nicht so wirklich ihren sinn ausspielen können, aber immerhin besser als nichts.
-
Helium schrieb:
Jochen Kalmbach schrieb:
und was Dir bei "Object^" fehlt...
Typsicherheit?
?????
.NET ist die Typsicherste Sprache die es gibt!!! Was fehlt Dir bei "is" oder "as"???
Bau Dir halt ein "Wrapper" um "Object" was Dir alle von Dir benötigten Type unterstützt....
-
---
edit: scheiß drauf
-
Sorry dass ich den "uralten" Artikel ausgrab, mir ist grad eingefallen, dass das vor kurzem mal Thema war..
Jochen Kalmbach schrieb:
Helium schrieb:
Jochen Kalmbach schrieb:
und was Dir bei "Object^" fehlt...
Typsicherheit?
?????
.NET ist die Typsicherste Sprache die es gibt!!!Die viele Punktuation macht diese Lüge auch nicht zutreffender.
1. .NET ist keine Sprache
2. Haskell ist wesentlich typsicherer als C# oder C++/CLIJochen Kalmbach schrieb:
Was fehlt Dir bei "is" oder "as"???
Bau Dir halt ein "Wrapper" um "Object" was Dir alle von Dir benötigten Type unterstützt....Kann das "int" und "char" und "std::type_info const *"? (Autoboxing ist eine Entschuldigung, keine Antwort.)
-
Mr. N schrieb:
1. .NET ist keine Sprache
Ja. Im eifer des gefechts bringt man das leicht durcheinander...
Mr. N schrieb:
Jochen Kalmbach schrieb:
Was fehlt Dir bei "is" oder "as"???
Bau Dir halt ein "Wrapper" um "Object" was Dir alle von Dir benötigten Type unterstützt....Kann das "int" und "char" und "std::type_info const *"? (Autoboxing ist eine Entschuldigung, keine Antwort.)
Verstehe ich jetzt nicht ganz...
-
Jochen Kalmbach schrieb:
Mr. N schrieb:
1. .NET ist keine Sprache
Ja. Im eifer des gefechts bringt man das leicht durcheinander...
Gefecht?
Jochen Kalmbach schrieb:
Mr. N schrieb:
Jochen Kalmbach schrieb:
Was fehlt Dir bei "is" oder "as"???
Bau Dir halt ein "Wrapper" um "Object" was Dir alle von Dir benötigten Type unterstützt....Kann das "int" und "char" und "std::type_info const *"? (Autoboxing ist eine Entschuldigung, keine Antwort.)
Verstehe ich jetzt nicht ganz...
Kann man in Object^ den Wert von &typeid(X) speichern? Schließlich sind typeid-Werte wohl kaum Managed und haben keine Kopierkonstruktor, daher muss man den Pointer nehmen. Oder soll ich mir dafür schon wieder ne Wrapper-Klasse bauen? Das ist aber wesentlich unbequemer, als einfach boost::variant<> zu nehmen...
-
Ich verstehe gerade den Zweck von dem & vor dem typeid nicht so ganz... Was spricht gegen "System::Type"?
-
Jochen Kalmbach schrieb:
Ich verstehe gerade den Zweck von dem & vor dem typeid nicht so ganz... Was spricht gegen "System::Type"?
Da C++/CLI unter Linux nicht geht, kenn ich das Zeug nicht. Ich bin naiverweise davon ausgegangen, dass es eine Variante von C++ ist, in der es daher legitim ist, die Standardbibliothek und Standardkeywords wie typeid zu benutzen. Offensichtlich nicht, da wie mir scheint alle Standarddinge nochmal implementiert wurden und man die Microsoft-Varianten benutzen muss. Was der Sinn von C++/CLI ist entzieht sich dann allerdings meinem Verständnis. Muss man sich ja immer erst überlegen, ob man ein Sprachfeature benutzen darf oder nicht...
-
Mr. N schrieb:
Jochen Kalmbach schrieb:
Ich verstehe gerade den Zweck von dem & vor dem typeid nicht so ganz... Was spricht gegen "System::Type"?
Da C++/CLI unter Linux nicht geht, kenn ich das Zeug nicht. Ich bin naiverweise davon ausgegangen, dass es eine Variante von C++ ist
Ich würde eher sagen, eine Erweiterung...
Wie soll man denn in ein "freies" C++-System ein 100% sicheres Typsystem integrieren, ohne dass man neue Ding erfindet?
typeid gibt es natürlich wieterhin noch und Du kannst das auch in ein "Object^" reinstecken... Es wird dann eben der Type reingesteckt...
-
Jochen Kalmbach schrieb:
Mr. N schrieb:
Jochen Kalmbach schrieb:
Ich verstehe gerade den Zweck von dem & vor dem typeid nicht so ganz... Was spricht gegen "System::Type"?
Da C++/CLI unter Linux nicht geht, kenn ich das Zeug nicht. Ich bin naiverweise davon ausgegangen, dass es eine Variante von C++ ist
Ich würde eher sagen, eine Erweiterung...
Wie soll man denn in ein "freies" C++-System ein 100% sicheres Typsystem integrieren, ohne dass man neue Ding erfindet?
typeid gibt es natürlich wieterhin noch und Du kannst das auch in ein "Object^" reinstecken... Es wird dann eben der Type reingesteckt...Es klang so als ging dies nicht.
Was ist ein "100% sicheres Typsystem"?
Wieso soll man eigentlich keinen Managed- und Unmanaged-Code vermischen?
Naja ich benutze wohl weiterhin mein gutes altes C++, auch weil C++/CLI bei mir nicht geht.
-
Mr. N schrieb:
Was ist ein "100% sicheres Typsystem"?
Das wirklich *alles* von einer Basisklasse abgeleitet ist und Du somit auch *alles* in ein "Object^" reinstopfen kannst (=> Variant).
Mr. N schrieb:
Wieso soll man eigentlich keinen Managed- und Unmanaged-Code vermischen?
Die Sprache ist eigentlich dazu da, dass man die beiden mischt. Man sollte es nur nicht machen, wenn man weder von "C/C++" noch von "C++/CLI" Ahnung hat dann bringt man immer mehr durcheinander, als dass man wirklich was nützliches dabei machen kann...
-
Jochen Kalmbach schrieb:
Mr. N schrieb:
Was ist ein "100% sicheres Typsystem"?
Das wirklich *alles* von einer Basisklasse abgeleitet ist und Du somit auch *alles* in ein "Object^" reinstopfen kannst (=> Variant).
Unter "sicher" versteh ich eher das Gegenteil. Dass man eben so wenig "stopfen" kann wie möglich. Und da ist z.B. Haskell wesentlich besser.
Und... ist "int" wirklich von Object abgeleitet??
Jochen Kalmbach schrieb:
Mr. N schrieb:
Wieso soll man eigentlich keinen Managed- und Unmanaged-Code vermischen?
Die Sprache ist eigentlich dazu da, dass man die beiden mischt. Man sollte es nur nicht machen, wenn man weder von "C/C++" noch von "C++/CLI" Ahnung hat dann bringt man immer mehr durcheinander, als dass man wirklich was nützliches dabei machen kann...
Das hab ich dann wohl nicht richtig verstanden. Es gibt übrigens kein "C/C++".
-
Jochen Kalmbach schrieb:
Mr. N schrieb:
Was ist ein "100% sicheres Typsystem"?
Das wirklich *alles* von einer Basisklasse abgeleitet ist und Du somit auch *alles* in ein "Object^" reinstopfen kannst (=> Variant).
Geht mit ganz normalem C++ auch. Siehe boost::any. boost::variant sieht zwar ganz ähnlich aus wird aber ganz anders benutzt.
-
Ben04 schrieb:
Geht mit ganz normalem C++ auch. Siehe boost::any.
Aber nichts *zwangsweise*. Sondern nur wenn jeder Programmierer sich auch daran hält...
Mr. N schrieb:
Und... ist "int" wirklich von Object abgeleitet??
Ja.
Mr. N schrieb:
Unter "sicher" versteh ich eher das Gegenteil.
Du kannst ja zu *jeder Zeit* nachprüfen/fragen, was für einen Type Du gerade hast.
-
Jochen Kalmbach schrieb:
Mr. N schrieb:
Unter "sicher" versteh ich eher das Gegenteil.
Du kannst ja zu *jeder Zeit* nachprüfen/fragen, was für einen Type Du gerade hast.
Explizit? Allein die Tatsache, dass es Object gibt verleitet doch dazu, das nicht zu machen...
-
Jochen Kalmbach schrieb:
Ben04 schrieb:
Geht mit ganz normalem C++ auch. Siehe boost::any.
Aber nichts *zwangsweise*. Sondern nur wenn jeder Programmierer sich auch daran hält...
boost::any geht mit jedem Typen, der einen Kopierkonstruktor hat.