Typprüfung von C++ abschalten?
-
gibt es eine praktikable Methode, um die Typprüfung von C++ generell außer Kraft zu setzen? So, daß man einen Generaltyp definiert, der dann in allen Funktionsaufrufen und -Rückgaben zum Einsatz kommt, und den man dann mit einem Präprozessor automatisch ergänzen könnte, sodaß man ihn nicht im Quelltext zu erwähnen bräuchte ?
/* Alles auf void* zu casten und die Parameterlisten seiner eigenen Funktionen auf void* umzustellen, ist zwar möglich, halte ich aber nicht für praktikabel, da man dann Wrapper für sämtliche Aufrufe aus den Standardlibraries schreiben müßte. */
Ist so etwas überhaupt möglich?
-
Die Typsicherheit von C++ lässt sich nicht einfach so ohne Hacks wie
void*
ausser Kraft setzen. Falls du jedoch einen dynamischen Typen brauchst, kannst du dir mal Boost.Any anschauen. Allerdings ist das immer noch so geregelt, dass die Typsicherheit weitgehend erhalten bleibt (man muss den Typ kennen, um darauf zuzugreifen). Aber was willst du mit dem "Generaltypen" überhaupt bezwecken?Ansonsten musst du dir halt eine andere Programmiersprache anschauen.
-
Du kannst eine allgemeine Basisklasse definieren, wie es z.B C# macht und dann gewisse Operationen anbieten.
(Halte ich aber nicht für sehr sinnvoll. Es gibt andere Wege etwas zu erreichen, was du glaubst so erreichen zu müssen. ;))In gewissen Umfang ist aber die Möglichkeit mit der gemeinsamen Basisklasse die beste Alternative.
-
es interessiert mich aus theoretischem Interesse heraus: kann man C++ ähnlich wie eine dynamische Skriptsprache oder wie awk einsetzen?
ähnlich, wie man C++ auch ein paar funktionale Verhaltensweisen anerziehen kann, bspw. lambda oder currying. C++ gilt ja als sehr flexibel, manche behaupten sogar, man könne mit C++ jeden Stil programmieren, da interessiert mich die Frage: also auch in dem Stil, in dem man dynamisch typisierte Sprachen benutzt ?
-
Das stimmt nicht ganz. Die Dynamik einer Skriptsrpache wirst du mit C++ niemals hinbringen. Es gibt gewisse Ansätze, die ansatzweise so etwas, wie dynamische Typisierung simulieren, aber das ganze ist sehr umständlich und wie gesagt hat es niemals die dynamik, wie eine Skriptsprache.
-
Da Scriptsprachen und sonstige Systeme ja auch oft in C/C++ entwickelt werden:
klar du kannst ein dynamisches Typsystem aufziehen - der benutzungskomfort ist dann im Keller, aber gehen tut es. Klar.
-
Shade Of Mine schrieb:
Da Scriptsprachen und sonstige Systeme ja auch oft in C/C++ entwickelt werden:
klar du kannst ein dynamisches Typsystem aufziehen - der benutzungskomfort ist dann im Keller, aber gehen tut es. Klar.Hmm. Das ist dann aber nicht mehr C++, dass man programmiert. Die Laufzeitumgebung ist dann in C++ geschrieben, aber mehr auch nicht.
-
u_ser-l schrieb:
gibt es eine praktikable Methode, um die Typprüfung von C++ generell außer Kraft zu setzen? So, daß man einen Generaltyp definiert, der dann in allen Funktionsaufrufen und -Rückgaben zum Einsatz kommt, und den man dann mit einem Präprozessor automatisch ergänzen könnte, sodaß man ihn nicht im Quelltext zu erwähnen bräuchte ?
Ist so etwas überhaupt möglich?
Warum sollte man das wollen???
C++ verfolgt eine bestimmte Linie. Und deshalb benutzt man auch C++. Wenn einem das Typprüfung nicht gefällt, muß man auf eine andere Sprache wechseln. Wenn du trotzdem nicht auf C++ verzichten willst, würde ich neben C++ eine nicht-typsichere Scriptsprache einbetten. Benutze doch einfach Lua, Python o.ä.Ansonst: verzichte auf C++.
-
drakon schrieb:
Hmm. Das ist dann aber nicht mehr C++, dass man programmiert. Die Laufzeitumgebung ist dann in C++ geschrieben, aber mehr auch nicht.
Ne, wieso?
Es ist normales C++. Nur statt std::string, int, vector verwendest du da halt Variant - dazu halt so Sachen wie setAttribute() und getAttribute().
in PHP wuerde man zB:
$var = new __stdclass(); $var->newAttr = "value"; echo $var->newAttr;
machen. In C++ dann halt:
Variant var; var.addAttribute("newAttr", "value"); cout<<var.getAttribute("newAttr");
Wie gesagt: komfort ist weg, deshalb macht es keinen Sinn - aber gehen tut es. Man sehe sich zB Spirit an -> das macht etwas aehnliches. Implementiert halt eine Meta-Programmierungs Umgebung in C++. Sieht nicht aus wie C++, ist umstaendlich, aber ist C++.
-
mit einem kompletten Typsystem oder einem in C++ programmierten Interpreter würde es also gehen - wäre aber etwas umständlich, den ganzen Rest vom System, die Libraries usw. umzustellen oder anzupassen.
Geht's vielleicht mit Präprozessor-Tricks oder mit Änderungen an RTTI oder dem cast-System ? Eine lambda-Konstruktion bekommt man ja damit auch hin.
@Bulli: warum mich das interessiert, hatte ich um 17:45 erklärt. Außerdem benutze ich Python und ein paar andere dynamisch typisierte Sprachen seit Jahren, wenn es nicht auf Laufzeit ankommt. Daß C++ keine dynamisch typisierte Sprache ist, ist mir geläufig. C++ ist auch keine funktionale Sprache, und dennoch gelingt es mit Präprozessor-Tricks lambda und currying nachzubilden. In diese Richtung zielt meine Frage.
-
@Shade Of Mine
Ja. Das schon. Aber ich habe das halt aus der Sicht des Typen gesehen. Und der kann sich in C++ nicht ändern. Du hast also immer den Typen Variant, oder sonst etwas.
Wenn man einen dynamischeren Typen haben will, muss man ja den Umweg z.B über strings gehen oder ein anderes System. Aber die eigentlichen Datentypen können sich nicht ändern. Klar kann man eine Klasse machen, der man noch zur Laufzeit irgendwelche Member hinzufügen kann, ist aber, wie du sagst eher umständlich und unnötig.