Was fehlt in C++11?
-
@StellerFragen: Vielleicht willst du so etwas? (ist halt nur ein Nachbau, ungetestet)
//MyClass.h class MyClass { class StaticRAII { public: Initializer() { MyClass::res.request(); } ~Initializer() { MyClass::res.release(); } }; static resource res; };//MyClass.cpp MyClass::StaticRAII MyClass_static_raii;
-
ipsec schrieb:
Ich sehe nicht, dass die RTTI-Möglichkeiten in C++ nicht "gescheit" sind.
Das sehe ich schon.
Aber sobald man sichif(Derived* d=dynamic_cast<Derived>(base)) d->flyLikeADerived();und
if(typeid(base)==typeid(Derived)) static_cast<Derived*>(base)->flyLikeADerived();abgewöhnt hat, braucht man RTTI nur noch unglaublich selten.
-
Ich denk sowas sollte man sich besser garnicht angewöhnen :p
Abgesehen davon verwendest du da oben doch RTTI!?
-
dot schrieb:
Abgesehen davon verwendest du da oben doch RTTI!?
Ja, in der Anfänger-Parodie. Selber nehme ich natürlich den Profitrick mit dem Wort virtual.
-
Interessant, dass noch niemand Reflection und Garbage Collector erwähnt hat... Wäre wohl anders, wenn dieses Thema in Rund um die Programmierung eröffnet worden wäre

-
Nexus schrieb:
Interessant, dass noch niemand Reflection und Garbage Collector erwähnt hat...
Wer würde denn sowas wollen :p (wobei: Mit "gescheiter RTTI Implementiertung" war wohl ersteres gemeint)
volkard schrieb:
dot schrieb:
Abgesehen davon verwendest du da oben doch RTTI!?
Ja, in der Anfänger-Parodie. Selber nehme ich natürlich den Profitrick mit dem Wort virtual.
Ah ok sry, war mir nicht sicher wies gemeint war. Hätt mich aber auch irgendwie ziemlich gewundert

-
Nexus schrieb:
Interessant, dass noch niemand Reflection und Garbage Collector erwähnt hat... Wäre wohl anders, wenn dieses Thema in Rund um die Programmierung eröffnet worden wäre

Nagut. Mit Reflection geht's auch, wenn man sich ein wenig Mühe gibt.
if(auto mf=Reflector(base)->getMemFun("flyLikeADerived")) if(mf->parameterlist.count()==0 && mf->returntype().name()=="void") static_cast<Derived>(base)->flyLikeADerived();
-
Nexus schrieb:
Interessant, dass noch niemand Reflection und Garbage Collector erwähnt hat
Jetzt wo dus erwähnst.. Runtimereflection und GC hat für mich mehr Nachteile als Vorteile, aber Compiletimereflection wäre wirklich etwas feines.
-
ipsec schrieb:
Runtimereflection und GC hat für mich mehr Nachteile als Vorteile [...]
Prinzipiell geb ich dir recht, ich halte RAII auch für ein bei weitem überlegenes Konzept. Allerdings hat das in Sprachen wie C# imo seine Berechtigung, damit entwickelt es sich sich zugegeben schon sehr viel schneller und einfacher. Reflection hab ich noch nie vermisst, die würd mir wohl nichtmal in C# wirklich abgehn...
Was ich letztens wieder hatte wo ich mir dachte das wär nice to have: Baut doch bitte mal jemand was ein um bei verschachtelten Schleifen ein break über mehrere Ebenen zu machen. Natürlich kann man mit irgendwelchen Flags arbeiten oder die innere Schleife in eine Funktion packen, aber wenn der Schleifenkörper einfach nur ein Ausdruck is der aber 40 lokale Variablen benötigt dann ist das anstrengend...
-
ipsec schrieb:
Nexus schrieb:
Interessant, dass noch niemand Reflection und Garbage Collector erwähnt hat
Jetzt wo dus erwähnst.. Runtimereflection und GC hat für mich mehr Nachteile als Vorteile, aber Compiletimereflection wäre wirklich etwas feines.
Ja.
Wobei die häufigste Anwendung wohl mit decltype, sizeof und alignof gelöst sind und viele weitere mit TMP incl SFINAE wie bei http://www.c-plusplus.net/forum/288521
-
dot schrieb:
Was ich letztens wieder hatte wo ich mir dachte das wär nice to have: Baut doch bitte mal jemand was ein um bei verschachtelten Schleifen ein break über mehrere Ebenen zu machen...
Da nimmste return. break2 ist was für PHP.
-
dot schrieb:
aber wenn der Schleifenkörper einfach nur ein Ausdruck is der aber 40 lokale Variablen benötigt dann ist das anstrengend...
40 lokale Variablen, die nicht in logisch zu Strukturen zusammengefaßt sind.
-
Ach, ja gut 40 war etwas übertrieben. Aber auch wenns nur 3 sind isses manchmal einfach blöd immer ne Funktion zu schreiben :p
Aber gut man kann ja jetzt einfach ein Lambda hinmachen^^
-
Für sowas gibt es doch das named loop idiom.

An so einfache Dinge wie pi habe ich jetzt gar nicht gedacht. Vielleicht überhaupt eine Ansammlung an mathematischen, physikalischen und anderen Konstanten oder sowas.
Wie siehts aus mit Dingen wie Shared Memory, GPU Berechnungen, RMI, ...
-
314159265358979 schrieb:
[...] GPU Berechnungen [...]
http://channel9.msdn.com/posts/Daniel-Moth-Blazing-fast-code-using-GPUs-and-more-with-C-AMP

Aber ich find nicht dass sowas in den C++ Standard gehört...
-
ipsec schrieb:
Ich sehe nicht, dass die RTTI-Möglichkeiten in C++ nicht "gescheit" sind.
Ach komm, dann musst du blind sein. Unter RTTI verstehe ich, dass man z.B. von einer Klasse die Member, den Namespace, die BaseClass usw. zur Laufzeit ermitteln lassen und darauf zugreifen kann. typeid ist dagegen ein Witz, soll man ja sowieso nicht verwenden.
wxSkip schrieb:
@StellerFragen: Vielleicht willst du so etwas? (ist halt nur ein Nachbau, ungetestet)
So ähnlich habe ich das, funktioniert auch aber ist halt sehr Fehleranfällig da man die dort gespeicherten Angaben nach einer Änderung der Klasse schnell mal vergisst zu aktualisiert.
-
StellerFragen schrieb:
Unter RTTI verstehe ich, dass man z.B. von einer Klasse die Member, den Namespace, die BaseClass usw. zur Laufzeit ermitteln lassen und darauf zugreifen kann.
Damit stehst du aber allein. RTTI ist in C++ bereits ein festgelegter Begriff, der primär
typeidunddynamic_castsowie das Exception-Dispatching beinhaltet.Verwende doch "Reflection" oder was Ähnliches, wenn du von umfassender Metaprogrammierung zur Laufzeit sprichst.
-
StellerFragen schrieb:
So ähnlich habe ich das, funktioniert auch aber ist halt sehr Fehleranfällig da man die dort gespeicherten Angaben nach einer Änderung der Klasse schnell mal vergisst zu aktualisiert.
Das versteh ich nicht, du kannst genausogut vergessen deinen statischen Konstruktor zu aktualisieren, macht doch absolut 0 Unterschied!?
-
StellerFragen schrieb:
wxSkip schrieb:
@StellerFragen: Vielleicht willst du so etwas? (ist halt nur ein Nachbau, ungetestet)
So ähnlich habe ich das, funktioniert auch aber ist halt sehr Fehleranfällig da man die dort gespeicherten Angaben nach einer Änderung der Klasse schnell mal vergisst zu aktualisiert.
Und in C# vergisst du das nicht? Meistens muss man statische Variablen ja sowieso nicht mehr als mit dem Konstruktor initialisieren und RAII sollten sie sowieso haben.
P.S.: Ich hätte noch eine Möglichkeit.
Du baust dir eine Template-Klasse RAIIManager<T>, mit der du folgendes machst:
//Header class MyClass { static Resource res; static RAIIManager<Resource> res_manager; }; //Source static Resource Myclass::res; static RAIIManager<Resource> Myclass::res_manager(Myclass::res, [](Resource &r){r.request();}, [](Resource &r){r.release();});EDIT: Vielleicht gibt es ja in C# eine Fehlermeldung, wenn man nicht alle statischen Member initialisiert.
-
wxSkip schrieb:
Und in C# vergisst du das nicht?
Nein, dort werden die Informationen wie Membername, Namespacename usw. ja automatisch hinzugefügt.
Bei C++ muss ich all die Informationen per Hand zur Verfügung stellen.