Wer was kann wird belohnt !!!
-
Sone::sig schrieb:
C++-Templates: Metaquark vom feinsten
You want to do X, and you think Y is the best way of doing so.
Instead of asking about X, you ask about Y.Hihi. Trifft fast das, was ich meine.
C++-Templates sind nötig. Ganz ohne müßte man stets schlaue Präprozessoren benutzen oder gleich Lisp (ist ja auch keine Schande).
Aber so langsam sind 95% der in freier Wildbahn entdeckten Meta-Programme unnötig verspielt oder gar ganz unnötig.
-
C++-Templates sind nötig.
Natürlich! Hat wer etwas anderes behauptet?
Allerdings finde ich in meinen Projekten zunehmend eine stark-unnötige template-isierung aller Funktionen (und teils auch Klassen). Ist das eine Krankheit?(Die beiden Teile meiner Signatur sind übrigens Zusammenhanglos gewählt worden)
-
Templates als Code-Generatoren zu benutzen, ist allerdings arg unübersichtlich. Es ist nunmal so, dass Templates sozusagen ein Callback-Mechanismus zur Code-Generierung durch den Compiler sind. In der C++-Syntax ist sozusagen ein Schema verankert, wie man etwas aussehen lassen muss, damit der Compiler daraus neue Zeichen ableiten kann. Und da wurstelt man sich dann so durch. Ich verstehe immer nicht, warum einerseits gut lesbarer Quelltext angepriesen wird, auf der anderen Seite aber Templates immer in die höchsten Sphären gelobt werden. Für was sie designed wurden, das ist gut lesbar und nachvollziehbar. Aber für was sie von den Gurus letztlich benutzt werden, ist zwar technisch möglich, aber hat mit gut lesbarem Quelltext nicht mehr viel gemein, meiner Meinung nach. Klar ist aber natürlich, dass es im Moment die einzige Möglichkeit ist, sich unter zuhilfename des C++-Typsystems Code generieren zu lassen. Wozu das mit dem Präprozessor führen würde, das erlebe ich ja gerade am eigenen Leib.
Ich finde die imperative Art und Weise, wie man sich in D Code generieren lassen kann, wäre für das, wofür die Templates eigentlich nicht designed wurden, irgendwie "passender".
/Discuss
-
Nun ja, es ist doch wohl allgemein bekannt, dass Templates C++ kaputt machen - sowohl das Build-System als auch Compilerfehler. (Man kann Implementierungen nicht mehr in .cpp Dateien stecken, und Typfehler werden aus der Implementierung heraus gemeldet, nicht beim Aufruf.) Lustigerweise bieten Templates für Letzteres wieder kleine Hacks an die das weniger nervig machen (enable_if, static_assert mit type_traits, ...) aber das macht Code uU auch wieder nur unübersichtlicher. Aber wenn die Sprache Modules + Concepts hätte, sähe ich da eigentlich kein Problem mehr.
Decimad schrieb:
aber hat mit gut lesbarem Quelltext nicht mehr viel gemein
Kannst du mal ein paar Beispiele dafür zeigen? Nur damit ich weiß, was genau du damit meinst.
-
cooky451 schrieb:
als auch Compilerfehler.
Hihi. Hatte vorhin aus Versehen auf einem map::iterator ein +1 gemacht.
Da bin ich fast vom Stuhl gefallen.||=== tggc5-2, Debug ===|
C:\src\research\tggc5-2\main.cpp||In function 'void erzeugeTeilerSub(std::vector<unsigned int>&, std::map<unsigned int, unsigned int>::iterator, std::map<unsigned int, unsigned int>::iterator, uint32_t)':|
C:\src\research\tggc5-2\main.cpp|21|error: no match for 'operator+' in 'begin + 1'|
C:\src\research\tggc5-2\main.cpp|21|note: candidates are:|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\stl_iterator.h|335|note: template<class _Iterator> std::reverse_iterator<_Iterator> std::operator+(typename std::reverse_iterator<_Iterator>::difference_type, const std::reverse_iterator<_Iterator>&)|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\stl_iterator.h|335|note: template argument deduction/substitution failed:|
C:\src\research\tggc5-2\main.cpp|21|note: mismatched types 'const std::reverse_iterator<_Iterator>' and 'int'|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\stl_iterator.h|1120|note: template<class _Iterator> std::move_iterator<_Iterator> std::operator+(typename std::move_iterator<_Iterator>::difference_type, const std::move_iterator<_Iterator>&)|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\stl_iterator.h|1120|note: template argument deduction/substitution failed:|
C:\src\research\tggc5-2\main.cpp|21|note: mismatched types 'const std::move_iterator<_Iterator>' and 'int'|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\basic_string.h|2362|note: template<class _CharT, class _Traits, class _Alloc> std::basic_string<_CharT, _Traits, _Alloc> std::operator+(const std::basic_string<_CharT, _Traits, _Alloc>&, const std::basic_string<_CharT, _Traits, _Alloc>&)|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\basic_string.h|2362|note: template argument deduction/substitution failed:|
C:\src\research\tggc5-2\main.cpp|21|note: 'std::map<unsigned int, unsigned int>::iterator {aka std::_Rb_tree_iterator<std::pair<const unsigned int, unsigned int> >}' is not derived from 'const std::basic_string<_CharT, _Traits, _Alloc>'|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\basic_string.tcc|694|note: template<class _CharT, class _Traits, class _Alloc> std::basic_string<_CharT, _Traits, _Alloc> std::operator+(const _CharT*, const std::basic_string<_CharT, _Traits, _Alloc>&)|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\basic_string.tcc|694|note: template argument deduction/substitution failed:|
C:\src\research\tggc5-2\main.cpp|21|note: mismatched types 'const _CharT*' and 'std::_Rb_tree_iterator<std::pair<const unsigned int, unsigned int> >'|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\basic_string.tcc|710|note: template<class _CharT, class _Traits, class _Alloc> std::basic_string<_CharT, _Traits, _Alloc> std::operator+(_CharT, const std::basic_string<_CharT, _Traits, _Alloc>&)|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\basic_string.tcc|710|note: template argument deduction/substitution failed:|
C:\src\research\tggc5-2\main.cpp|21|note: mismatched types 'const std::basic_string<_CharT, _Traits, _Alloc>' and 'int'|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\basic_string.h|2399|note: template<class _CharT, class _Traits, class _Alloc> std::basic_string<_CharT, _Traits, _Alloc> std::operator+(const std::basic_string<_CharT, _Traits, _Alloc>&, const _CharT*)|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\basic_string.h|2399|note: template argument deduction/substitution failed:|
C:\src\research\tggc5-2\main.cpp|21|note: 'std::map<unsigned int, unsigned int>::iterator {aka std::_Rb_tree_iterator<std::pair<const unsigned int, unsigned int> >}' is not derived from 'const std::basic_string<_CharT, _Traits, _Alloc>'|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\basic_string.h|2415|note: template<class _CharT, class _Traits, class _Alloc> std::basic_string<_CharT, _Traits, _Alloc> std::operator+(const std::basic_string<_CharT, _Traits, _Alloc>&, _CharT)|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\basic_string.h|2415|note: template argument deduction/substitution failed:|
C:\src\research\tggc5-2\main.cpp|21|note: 'std::map<unsigned int, unsigned int>::iterator {aka std::_Rb_tree_iterator<std::pair<const unsigned int, unsigned int> >}' is not derived from 'const std::basic_string<_CharT, _Traits, _Alloc>'|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\basic_string.h|2427|note: template<class _CharT, class _Traits, class _Alloc> std::basic_string<_CharT, _Traits, _Alloc> std::operator+(std::basic_string<_CharT, _Traits, _Alloc>&&, const std::basic_string<_CharT, _Traits, _Alloc>&)|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\basic_string.h|2427|note: template argument deduction/substitution failed:|
C:\src\research\tggc5-2\main.cpp|21|note: 'std::map<unsigned int, unsigned int>::iterator {aka std::_Rb_tree_iterator<std::pair<const unsigned int, unsigned int> >}' is not derived from 'std::basic_string<_CharT, _Traits, _Alloc>'|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\basic_string.h|2433|note: template<class _CharT, class _Traits, class _Alloc> std::basic_string<_CharT, _Traits, _Alloc> std::operator+(const std::basic_string<_CharT, _Traits, _Alloc>&, std::basic_string<_CharT, _Traits, _Alloc>&&)|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\basic_string.h|2433|note: template argument deduction/substitution failed:|
C:\src\research\tggc5-2\main.cpp|21|note: 'std::map<unsigned int, unsigned int>::iterator {aka std::_Rb_tree_iterator<std::pair<const unsigned int, unsigned int> >}' is not derived from 'const std::basic_string<_CharT, _Traits, _Alloc>'|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\basic_string.h|2439|note: template<class _CharT, class _Traits, class _Alloc> std::basic_string<_CharT, _Traits, _Alloc> std::operator+(std::basic_string<_CharT, _Traits, _Alloc>&&, std::basic_string<_CharT, _Traits, _Alloc>&&)|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\basic_string.h|2439|note: template argument deduction/substitution failed:|
C:\src\research\tggc5-2\main.cpp|21|note: 'std::map<unsigned int, unsigned int>::iterator {aka std::_Rb_tree_iterator<std::pair<const unsigned int, unsigned int> >}' is not derived from 'std::basic_string<_CharT, _Traits, _Alloc>'|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\basic_string.h|2451|note: template<class _CharT, class _Traits, class _Alloc> std::basic_string<_CharT, _Traits, _Alloc> std::operator+(const _CharT*, std::basic_string<_CharT, _Traits, _Alloc>&&)|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\basic_string.h|2451|note: template argument deduction/substitution failed:|
C:\src\research\tggc5-2\main.cpp|21|note: mismatched types 'const _CharT*' and 'std::_Rb_tree_iterator<std::pair<const unsigned int, unsigned int> >'|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\basic_string.h|2457|note: template<class _CharT, class _Traits, class _Alloc> std::basic_string<_CharT, _Traits, _Alloc> std::operator+(_CharT, std::basic_string<_CharT, _Traits, _Alloc>&&)|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\basic_string.h|2457|note: template argument deduction/substitution failed:|
C:\src\research\tggc5-2\main.cpp|21|note: mismatched types 'std::basic_string<_CharT, _Traits, _Alloc>' and 'int'|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\basic_string.h|2463|note: template<class _CharT, class _Traits, class _Alloc> std::basic_string<_CharT, _Traits, _Alloc> std::operator+(std::basic_string<_CharT, _Traits, _Alloc>&&, const _CharT*)|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\basic_string.h|2463|note: template argument deduction/substitution failed:|
C:\src\research\tggc5-2\main.cpp|21|note: 'std::map<unsigned int, unsigned int>::iterator {aka std::_Rb_tree_iterator<std::pair<const unsigned int, unsigned int> >}' is not derived from 'std::basic_string<_CharT, _Traits, _Alloc>'|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\basic_string.h|2469|note: template<class _CharT, class _Traits, class _Alloc> std::basic_string<_CharT, _Traits, _Alloc> std::operator+(std::basic_string<_CharT, _Traits, _Alloc>&&, _CharT)|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\basic_string.h|2469|note: template argument deduction/substitution failed:|
C:\src\research\tggc5-2\main.cpp|21|note: 'std::map<unsigned int, unsigned int>::iterator {aka std::_Rb_tree_iterator<std::pair<const unsigned int, unsigned int> >}' is not derived from 'std::basic_string<_CharT, _Traits, _Alloc>'|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\stl_bvector.h|268|note: std::_Bit_iterator std::operator+(std::ptrdiff_t, const std::_Bit_iterator&)|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\stl_bvector.h|268|note: no known conversion for argument 1 from 'std::map<unsigned int, unsigned int>::iterator {aka std::_Rb_tree_iterator<std::pair<const unsigned int, unsigned int> >}' to 'std::ptrdiff_t {aka int}'|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\stl_bvector.h|354|note: std::_Bit_const_iterator std::operator+(std::ptrdiff_t, const std::_Bit_const_iterator&)|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\stl_bvector.h|354|note: no known conversion for argument 1 from 'std::map<unsigned int, unsigned int>::iterator {aka std::_Rb_tree_iterator<std::pair<const unsigned int, unsigned int> >}' to 'std::ptrdiff_t {aka int}'|
||=== Build finished: 1 errors, 0 warnings (0 minutes, 2 seconds) ===|
-
Und das ist nicht mal besonders schlimm, das hier
no match for 'operator+' in 'begin + 1'|
steht ja direkt am Anfang. Aber: Research/TGGC?
-
Weshalb? Die Fehlermeldung ist doch stringent und bringt es direkt auf die Punkte!
-
Aber für was sie von den Gurus letztlich benutzt werden
Das sind keine Gurus.
Ich finde die imperative Art und Weise, wie man sich in D Code generieren lassen kann, wäre für das, wofür die Templates eigentlich nicht designed wurden, irgendwie "passender".
Kenne D nicht, aber hast du mal Scheme angeschaut? Mittlerweile hat C++ auch ... .
-
cooky451 schrieb:
Aber: Research/TGGC?
Da in src/research/ steht alles drin, was temporär, experimentell, privat und noch nicht stabil ist.
Vielleicht wäre src/unstable/ besser? oder src/tmp/ oder besser aber je nachdem. Es drückt es nicht wirklich aus, denn unter src/ hat jeder Auftraggeber sein eigenes Verzeichnis und darin wird ja auch geforscht. Vielleicht ist src/private besser. Jo, wohl schon, so benutze ich das Verzeichnis.edit: Ach, Quatsch!
Es heißt research (~in Wahrheit frickeln~) in meinem unterirdischen Labor (Kellerwohnung).
-
Mal davon abgesehen, dass D's templates basierend auf den Erfahrungen, die in C++ gemacht wurden und den viel mächtigeren compile-time-Sachen (wofür jetzt ja constexpr nachgerüstet wird), viel abgefahrener sind, gibt es halt auch mixins. Da wird zur Compile-Zeit in echten Funktionen durch string-Zusammensetzung neuer Quellcode generiert.
Siehe: http://dlang.org/mixin.html
Muss man natürlich nicht übertreiben, aber etwas flexibleres kann ich mir kaum noch vorstellen.
Da gibts auch eine nette Zusammenstellung über die D-templates...
Dort wird auch beschrieben, fällt mir gerade auf, was ich im c++-Forum bemängelt hatte, nur viel besser ausgedrückt. Dass man in C++-Templates oftmals obskure Spracheigenschaften ausnutzt, um ansonsten eigentlich klare Ideen umzusetzen.
Wenn ich das so sehe, werde ich natürlich ganz neidisch mit meinem C++
Edit: volkard, ich hab in meinen Solutions immer ein oder mehrere Projekte, die sich irgendwie "Spielwiese" oder "Frickelfestung" nennen
-
Decimad schrieb:
Weshalb? Die Fehlermeldung ist doch stringent und bringt es direkt auf die Punkte!
Nunja. Aber wenn der Compiler alleine 2 Sekunden braucht, um die Fehlermeldungen zu erzeugen, mir so viel Text an den Kopp knallt...
Nee, das macht micht nicht glücklich.
Ja, hier reicht es, auf die erste Zeile zu klicken und er sagt ja "error: no match for 'operator+' in 'begin + 1". Da kann ich mir denken, daß die Leute keinen op+(int) gemacht haben, weil der auf einem Baum dann doch zu lahm wäre.Es kommt aber oft genug vor, daß man was schreibt, was jedem verständigen Programmierer total offenkundig als richtig erscheinen muss, und das nicht in der ersten Zeile erklärt wird. Dann ist es in einer beliebigen der folgenden.
Darum lese ich die Template-Fehlermeldungen schon gar nicht mehr. Die sind mir latte. Wenn sowas kommt, schaue ich die letzen Zeilen an, die ich gebaut habe und überlege, was daran falsch sein könnte. Klappt fast immer und spart Ärger. Ok, es ist dazu vielleicht fast notwendig, daß man selber die benutzen Klassen bauen könnte und genug ähnlicher gebaut hat, um eine Gefühl für Template-Fehlermeldungen zu haben. Für mich ist der Weg ok. Wenn der Compiler 2s zum Erzeugen der Fehlermeldungen braucht oder sonstwie gleich seitenweise Schrott erscheint, dann klicke ich die oberste anklickbare Zeile (falls die IDE das nicht schon übernimmt), lese den Fehlertext und schaue die Zeile an, und wenn das nicht erfolgreich ist, dann überlege ich mir, was schiefgegangen sein mag. Und wenn es nicht klappt, dann überlege ich nochmal weniger oberflächlich. Dann denke ich darüber nach, den Debugger anzuwerfen. Aber diese Meldungen alle zu lesen, nö. Nur im Notfall. Bringt eh nix. Sourcecode angucken, von dem, was man aufrufen wollte, ist schneller.
-
Decimad schrieb:
Edit: volkard, ich hab in meinen Solutions immer ein oder mehrere Projekte, die sich irgendwie "Spielwiese" oder "Frickelfestung" nennen
Die hätte ich einheitlich research genannt. oder einheitlich frickelfestung. oder egal, einheitlich.
Weißte, ich bin so extrem, daß ich den Hund Hund nenne und die Katze Katze. "Kind, hol mir ein Bier und füttere dann die Katze." Das Auto heißt bei mir Auto und nicht "Sylvester". Das Kind kann sich in der Schule "Chantal" nennen lassen. Ich muss viel zu viel überlegen, wenn die Namen nicht klar sind. Papi heißt "Helmut", das ist ok. Hund heißt "Asta", das ist auch ok.
Ein Nachbarshund heißt "Susanne".
Kotz, dasist ja wiedouble m_lpachConfig;
-
Ach, bei diesen Testsachen bin ich irgendwie verspielt und freue mich immer wie ein kleines Kind, wenn ich mal wieder (mehr als gewöhnlich) rumfrickeln darf. Ist ja nichts, das irgendwie großartigen Bestand hat oder wird anschließend direkt an den passenden Ort verschoben.
Das mit Deinen Fehlermeldungen meinte ich gar nicht so sehr ernst (daher "auf die Punkte bringen").
Meinst du "m_lpachConfig" in "Hrmm, Member, also m_", Pointer, genau, "m_lp", aber was ist es eigentlich, hrmmm, ach, nehmen wir Config -> "m_lpachConfig" ?
-
lpach ist "long pointer to array of character". also ein dynmaischer C-Sring, der NICHT nullterminiert ist, sonst wäre es ja ein lpsz.
Der kann weder links in einen double gestopfigt werden, noch rechts eine Config halten. Da war einfach alles falsch.
-
Decimad schrieb:
und freue mich immer wie ein kleines Kind, wenn ich mal wieder
Das verbindet uns.
-
Hehe, ich weiß nicht ob ich nicht vielleicht froh darüber sein sollte, dass ich den Scherz nicht kapiert habe
-
Ich glaube ich bin der Richtige Kanidat für euch, ich hab in der Grundschule die Fahrradführerscheinprüfung erfolgreich bestanden!
Das bedeutet: Ich kann Fahrrad fahre.
So und jetzt möchte ich gerne meine Belohnung haben danke. (Der Thread Titel heisst ja wohl nicht umsonst: Wer was kann wird belohnt !!!)
-
Hey, ich kann das kleine Einmaleins! Wo ist meine Belohnung!?
-
Swordfish schrieb:
Hey, ich kann das kleine Einmaleins! Wo ist meine Belohnung!?
Wo ist der Beweis?
-
volkard schrieb:
cooky451 schrieb:
als auch Compilerfehler.
Hihi. Hatte vorhin aus Versehen auf einem map::iterator ein +1 gemacht.
Da bin ich fast vom Stuhl gefallen.Ich glaub, min Rekord in der Richtung lag bei ca 200kb fehlermeldungen für einen ähnlich trivialen Fehler.
Aber der Txp war halt etwas aufgebläht und es gab da so ein paar Instantiierungskontexte...
Aber ja, der Nutzen der Fehlermeldungen geht meist gegen 0. Mistens leite ich sie in ein Datei um, lass ein Script durchlaufen, dass die geläufigsten konstrukte gegen bekannte typedefs ersetzt und mache dann search & replace bis die Fehlermeldungen wieder schön auf eine Bildschirmseite passen.