Diskussion:C++-Metaprogrammierung

message: IMHO sollten nur wichtige und bekannte Autoren zu einem Wikipedia-Artikel verlinkt werden; vor allem, wenn die Artikel noch gar nicht existieren, halte ich das pauschale Verlinken für überflüssig. Leider kann ich nicht entscheiden, welche Autoren "bekannt" sind und welche nicht. --Christoph 00:08, 26. Mai 2005 (CEST)
thread_title: Autorenverlinkung bei den Literaturempfehlungen

message: "Es gibt aber auch Metaprogrammierung mittels C-Makros"
So stehts im Artikel. Kann das denn jemand bestätigen? Ich habe im Internet nichts darüber gefunden...
Auch ist es AFAIK nicht möglich rekursive C Makros zu definieren, wodurch die Metaprogrammierung mit Hilfe von C- Makros
schon arg eingeschränkt wäre, falls es sowas wirklich geben sollte. Gruß--Demoncleaner 23:37, 13. Aug 2006 (CEST)
thread_title:  Metaprogrammierung mittels C- Makros 

message: Ohne dass ich jemanden angreifen möchte, aber der Beispiel-Code ist nicht ganz koscher w.r.t. Kompilierzeit-Auswertung:
 template<long B, unsigned long E>
 struct pow_helper {
   static long const value = B * pow_helper<B, E - 1>::value;
 };
static long const: Warum kein enum? Eine statische Membervariable kann ganz schnell "aus versehen" ein lvalue werden (siehe nächsten Punkt) und nimmt wahrscheinlich Speicherplatz im Kompilat in Anspruch. (siehe auch Vandevoorde/Josuttis)
 
 template<long B, long E>
 struct power {
    static double const value;
 };
static const double: Und schon haben wir einen L-Value, der evtl. erst zur Laufzeit ausgewertet wird. Außerdem lässt sich power::value nicht als Argument für andere templates verwenden (in meinen Augen das Killer-Argument gegen das Vorhandene, da sich das Template dadurch nicht innerhalb der C++-Metaprogrammierung verwenden lässt). Ich denke, wir sollten darauf verzichten bis der Standard es richtet. 
Nachtrag: Natürlich lassen sich Fließkommaberechnungen innerhalb der Template-Meta-Programmierung durchführen, aber nicht mit builtin-Typen. Thierry Berger-Perrin hat hierzu das IEEE-konforme "Metafloat" veröffentlicht.
 template<long B, long E>
 double const power<B, E>::value= E < 0 ? 1.0 / pow_helper<B, E < 0 ? -E : 0>::value
                                        : pow_helper<B, E < 0 ? 0 : E>::value;
Hier wird der Compiler versuchen, ingesamt vier Verzweigungen { ? (?1:2) : (?3:4) } auszuwerten, nur für die erste Rekursion. Der ternäre Operator sollte niemals in dieser Weise verwendet werden. Ich weiß, er wird benötigt, da double-Werte nicht als Parameter verwendet werden können, und somit keine negativen Exponenten erlaubt sind, aber er macht aus einem linear komplexem Konstrukt ein exponentielles.
Ich schlage vor, wir ersetzen das Konstrukt durch eine einfache, KISS-konforme Lösung, die auch vom Anfänger begriffen werden kann. Man könnte dann einen Hinweis auf die Fließkomma-Problematik im Text platzieren.
Mein Vorschlag:
 // static_pow.h
 template <int BASE, unsigned int EXP> struct pow {
     enum { value = BASE * pow<BASE, EXP-1>::value };
 };
 template <int BASE> struct pow<BASE, 0> {
     enum { value = 1 };
 };
 // main.h
 #include <iostream>
 int main () {
    // Tests for base 2.
    ::std::cout << "2^0 = " << pow<2,0>::value << '\n';
    ::std::cout << "2^1 = " << pow<2,1>::value << '\n';
    ::std::cout << "2^2 = " << pow<2,2>::value << '\n';
    ::std::cout << "2^3 = " << pow<2,3>::value << '\n';
    ::std::cout << "2^16 = " << pow<2,16>::value << '\n';
    ::std::cout << "-2^0 = " << pow<-2,0>::value << '\n';
    ::std::cout << "-2^1 = " << pow<-2,1>::value << '\n';
    ::std::cout << "-2^2 = " << pow<-2,2>::value << '\n';
    ::std::cout << "-2^3 = " << pow<-2,3>::value << '\n';
    ::std::cout << "-2^16 = " << pow<-2,16>::value << '\n';
 }
Phresnel 10:52, 17. Feb. 2009 (CET)
replies: text: Gute Idee. Make it so! :-) --RokerHRO 14:26, 10. Nov. 2011 (CET)
thread_title:  Beispiel "power" vereinfachen? 

message: Auf jeden Fall müssen Typlisten erwähnt werden. In der deutschsprachigen Wikipedia wird dieses mächtige Konzept in keinem Satz erwähnt. Nach dem Urlaub füge ich es eventuell hinzu. --Chricho 12:56, 18. Jul. 2009 (CEST)
replies: text: Hm, schade, dass dein Urlaub so lange geht. Oder hast du es inzwischen vergessen oder die Lust verloren? --RokerHRO 14:27, 10. Nov. 2011 (CET)
thread_title:  Typlisten! 

message: C++-Templates ähneln sehr stark puren Haskell-Funktionen, nur eben zur Kompilierzeit.
Man kann ja einmal vergleichen:
Haskell: eql-Specializers
C++: Template-Spezialisierung
Haskell: Elementare Rechenoperationen und Typen
C++: Genau das selbe
Haskell: Arrays und Listen
C++: (Typ-)listen (Listen von Nicht-Typen sind selbstverständlich auch möglich)
Haskell: Starke und statische Typisierung
C++: Überwiegend starke und statische Typisierung (implizite Umwandlungen nur zwischen integrierten Typen)
Haskell: Keine Seiteneffekte
C++: Keine Seiteneffekte
So viel Ähnlichkeit verdient doch einen kurzen Satz zu Beginn bei der funktionalen Programmierung.
Gegen diese funktionale Programmierung habe ich ja nichts, nur schade, dass sich diese Struktur in der Instantiierung wieder findet. Typ-Listen lassen sich leider nicht linearisieren und man kann dann nur noch auf einen guten Optimierer hoffen, der dämliche if-Abfragen und Aufrufe verschiedener Funktions-Template-Instantiierungen auflöst. --Chricho 13:06, 18. Jul. 2009 (CEST)
thread_title:  Ähnlichkeit zu Haskell ansprechen? 

message: Meiner Meinung nach gibt es dazwischen keinen Unterschied. Siehe auch Einleitung. Hast du Belege für deine Vermutung? --Casu17 (Diskussion) 17:11, 17. Mär. 2012 (CET)
replies: text: Sicher. Schau dir Metaprogrammierung an. Das Entscheidende bei dieser ist die Möglichkeit, Programmstrukturen erzeugen zu können, ob Compile- oder Laufzeit spielt gar nicht mal eine Rolle, bei vielen Lisp-Dialekten etwa ist das nicht getrennt. Über constexpr ist an sich keine Metaprogrammierung möglich, das Vorausberechnen von eine paar Werten ist keine Metaprogrammierung. Das Potenz-Beispiel ist sinnvoll, weil daran sichtbar wird, dass hier eine zumindest im Sinne der Berechenbarkeit vollständige Programmiersprache zur Metaprogrammierung vorliegt. Und solche Konstrukte können natürlich der Metaprogrammierung dienen, ebenso wie constexpr, das gerade zur Vereinfachung solcher eingeführt wurde, sie machen aber nicht die Metaprogrammierung aus. --Chricho ¹ ² 17:17, 17. Mär. 2012 (CET)
replies: text: Werte gehören auch zum Programmcode. --Casu17 (Diskussion) 17:33, 17. Mär. 2012 (CET)
replies: text: Na, dann wäre ja jegliche Form von Programmierung Metaprogrammierung. Der Wert, den der Benutzer für seinen Namen eingegeben hat, bestimmt ja auch, was der Code dann macht. Naja, laut en:Meta programming wird das Wort auch für die Berechnung von Sachen zur Compilezeit verwandt, da sollte man sich nochmal nach einer ordentlichen Quelle umschauen. Wenn diese Doppelbelegung hier auch verwendet werden soll, dann muss das zumindest klar dargestellt werden. --Chricho ¹ ² 17:42, 17. Mär. 2012 (CET)
replies: text: Entscheidend ist meiner Meinung nach, dass Code von Code erzeugt wird (was beim Benutzernamen nicht der Fall ist). Bei 1+1 könnte man also im weitesten Sinne auch von Metaprogrammierung sprechen. Bei Konstrukten mit constexpr ist der erzeugende Code darüber hinaus isolierbar und dadurch wiederverwendbar. Außerdem ist der erzeugende Code parametrierbar. --Casu17 (Diskussion) 17:58, 17. Mär. 2012 (CET)
replies: text: Dann halt nicht der Benutzername sondern eine große Tabelle von Primzahlen oder sowas. ;) --Chricho ¹ ² 18:03, 17. Mär. 2012 (CET)
replies: text: Eine Tabelle ist kein Programmcode. --Casu17 (Diskussion) 19:31, 17. Mär. 2012 (CET)
replies: text: Und wenn const und constexpr davor steht, ist es Programmcode? Und der Compiler wird dann auch nichts anderes machen, als eine Tabelle in der Objekt-Datei anzulegen in dem entsprechenden Format. --Chricho ¹ ² 01:29, 18. Mär. 2012 (CET)
thread_title:  Abgrenzung "Metaprogrammierung"/"Berechnungen zur Compilezeit" 

message: Konstante Ausdrücke waren schon vor C++11 definiert, etwa war 1+1 schon immer ein konstanter Ausdruck, weshalb man ihn als Templateparameter benutzen durfte. C++11 führt nun eine neue Art konstanter Ausdrücke ein: Aufrufe von als constexpr markierten Funktionen mit konstanten Ausdrücken als Parametern. Siehe zur Wortverwendung etwa , dort wird definiert, was ein konstanter Ausdruck sein soll. --Chricho ¹ ² 17:28, 17. Mär. 2012 (CET)
replies: text: Ja. Aber das habe ich doch geschrieben. --Casu17 (Diskussion) 17:33, 17. Mär. 2012 (CET)
replies: text: Verzeihung, falsch gelesen, ich probiers nochmal. --Chricho ¹ ² 17:38, 17. Mär. 2012 (CET)

text: Zufrieden? --Chricho ¹ ² 17:44, 17. Mär. 2012 (CET)
replies: text: Schon besser. Wenigstens steht nicht mehr das Schlüsselwort im Mittelpunkt. Das ist nämlich völlig nebensächlich. Während der Entwicklung dieser Spracherweiterung wurden auch Varianten diskutiert, die ohne ein neues Schlüsselwort auskommen. --Casu17 (Diskussion) 17:47, 17. Mär. 2012 (CET)
replies: text: Ja, du hast vollkommen Recht, das das nebensächlich ist, mir war einfach nichts besseres eingefallen, um zu vermeiden, dass es so klingt, als bezöge sich der Begriff „konstante Ausdrücke“ nur darauf. --Chricho ¹ ² 17:51, 17. Mär. 2012 (CET)
thread_title:  Konstante Ausdrücke 

message: Im Editkommentar hast du geschrieben: entscheidend ist nicht das Jahr, sondern der Standard, gabs auch schon vor 2011 in den Entwürfen. C++11 ist aber genau 2011 erschienen, nicht vorher und nicht nachher. Die Allgemeinverständlichkeit ist bei Nennung der Jahreszahl besser. --Casu17 (Diskussion) 19:29, 17. Mär. 2012 (CET)
replies: text: Das würde Sinn machen bei Sprachen, die eine einzige Implementierung haben und ständig neue Features bekommen, da kann man dann sagen, in dem und dem Jahr wurde ein bestimmtes Feature eingebaut. Hier ist das irreführend, weil der unbedarfte Leser vielleicht nicht weiß, wie das bei C++ läuft und das mit Compilersupport etc. verwechselt. Man kann ja eine kleine Erklärung hinzufügen. --Chricho ¹ ² 19:32, 17. Mär. 2012 (CET)
thread_title:  Nennung der Jahreszahl statt C++11 

message: Meiner Meinung nach schießt das Thema "Typlisten" zu weit über das eigentliche Thema des Artikels hinaus. Der Zusammenhang zum Artikelgegenstand wird auch überhaupt nicht erklärt. Von mir aus kann der gesamte Abschnitt raus. --Casu17 (Diskussion) 01:28, 18. Mär. 2012 (CET)
replies: text: Wir sollten uns fragen: Was genau wollen wir eigentlich drin haben? Typlisten sind ein Kernkonzept, um fortgeschrittene C++-Metaprogrammierung umzusetzen, will man etwa gewisse Patterns mit Hilfe von C++-Metaprogrammierung in allgemeiner Form verwirklichen, ist so etwas notwendig, auch wenn man in vielen Fällen dann heutzutage noch variadische Templates zur Hilfe ziehen würde, aber das widerspricht dem ja nicht konzeptuell, sondern ergänzt die praktische Umsetzung. In solchen Fällen sind Typlisten jedenfalls wesentlich wichtiger als Berechnungen von Potenzen, welche nicht gerade näher dran an der Metaprogrammierung sind. Wir sollten uns einigen, worauf wir mit dem Artikel hinaus wollen. Eigentlich müssten ganz andere Aspekte viel stärker betont werden: Policy based design (mit Optimierungsaspekten), statischer Polymorphismus, Umsetzung von Patterns. Im Moment beschränkt es sich eher auf Hilfsmittel (wie man sie etwa in großem Umfang in boost::mpl findet) statt auf das, was man damit macht. --Chricho ¹ ² 01:42, 18. Mär. 2012 (CET)
replies: text: Darin, das Thema sinnvoll (!) zu vertiefen, stimme ich überein. Aber warum muss der Abschnitt während der Zeit im Artikel bleiben? Wenn wir uns später entscheiden, ihn in irgendeiner Form einzubauen, können wir das immer noch tun. So, wie der Abschnitt momentan aussieht, also ohne Erklärung des Zusammenhanges, ist es nur verwirrend. So darf ein Artikel nicht online gehen. Deswegen bin ich dafür, den Abschnitt vorläufig zu entfernen. --Casu17 (Diskussion) 13:54, 18. Mär. 2012 (CET)
replies: text: Das Beispiel ist wohl zu lang. Was hälst du von einem Abschnitt „In Templatemetaprogrammierung verwendete Konstrukte“, in den man dann Typlisten ohne ein solch gigantisches Beispiel einfügt? --Chricho ¹ ² 14:04, 18. Mär. 2012 (CET)
replies: text: Ich sähe gerne einen Abschnitt der Dinge thematisiert, die du anfangs angesprochen hast: Codegenerierung (also nicht reine Wertberechnung). Es sollte etwas sein, das typischerweise in der Templatemetaprogrammierung verwendet wird, aber dennoch leicht zu verstehen ist. Der Abschnitt sollte in keinem Fall zu einer reinen Aufzählung oder Sammlung von Programmierbeispielen verkommen. --Casu17 (Diskussion) 14:18, 18. Mär. 2012 (CET)
replies: text: Was meinst du mit „es sollte etwas sein, das“? Du meinst ein aussagekräftiges Beispiel? --Chricho ¹ ² 14:26, 18. Mär. 2012 (CET)
replies: text: Deine letzten Änderungen waren schon ganz gut. --Casu17 (Diskussion) 17:02, 18. Mär. 2012 (CET)
thread_title:  Typlisten 

message: Ich habe jetzt eine Variante mit Wikimedia-Bordmitteln umgesetzt. Einwände? Kommentare? --Casu17 (Diskussion) 03:05, 27. Mär. 2012 (CEST)
replies: text: Eher eine Notlösung als eine Lösung. Sollte so bald wie möglich wieder raus und durch die automatische Formatierung ersetzt werden. --KMic (Diskussion) 01:38, 23. Apr. 2012 (CEST)
thread_title:  Syntaxhervorhebung der Schlüsselwörter durch Fettdruck