Was ist Templatemetaprogrammierung?
-
Ich weiß zwar was Templates sind, aber der Begriffs Templatemetaprogrammierung verunsichert mich ein wenig. Man könnte doch meinen, sobald man ein Template nutzt, nutzt man auch Metaprogrammierung, denn der eigentliche Programmcode wird aus dem von mir bereitgestellten Template-Code generiert.
In der Wikipedia (http://de.wikipedia.org/wiki/C%2B%2B-Metaprogrammierung) ist dieses Beispiel für C++ Metaprogrammierung zu finden:
#include <iostream> template<long B, unsigned long E> struct pow_helper { static long const value = B * pow_helper<B, E - 1>::value; }; template<long B> struct pow_helper<B, 0> { static long const value = 1; }; template<long B, long E> struct power { static double const value; }; 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; int main() { std::cout << power<10, -3>::value << std::endl; }Was wertet der Compiler hier jetzt alles aus? Theoretisch könnte er ja bis auf das Ergebnis runterrechnen, sodass der generierte code so aussieht:
int main() { std::cout << 0.001 << std::endl; }Andererseits weiß ich von Templates, dass die nur Blaupausen für Code sind. Deshalb könnte man meinen, der Compiler generiert Code, der zur Laufzeit die Potenz berechnet.
Was ist Templatemetaprogrammierung nun? Programmierung von Templates, die der Compiler zur Compilezeit komplett, bis auf das gewünschte Ergebnis auswerten kann, oder das generieren lassen von Programmcode? Oder beides zusammen?
-
Die Template Metaprogrammierung ist zu beidem in der Lage, sowohl zur Berechnung der Werte zur Compile-Zeit als auch zum Generieren von Programmcode, wobei das Generieren von Programmcode wohl wichtiger ist.
-
ich bin ein noob schrieb:
Was ist Templatemetaprogrammierung nun? Programmierung von Templates, die der Compiler zur Compilezeit komplett, bis auf das gewünschte Ergebnis auswerten kann, oder das generieren lassen von Programmcode? Oder beides zusammen?
Beides. in deinem Beispiel berechnet der compiler einfach nur das Ergebnis. Aber man kann mit tmp zum Beispiel ein grundgerüst für das visitor pattern bauen, das dir dann die passenden methoden für die Klassen generiert. Wenn du da wirklich dran interessiert bist, kann ich dir das Buch "modern C++ Design" von Andrei Alexandrescou empfehlen, allerdings kratzt das inzwischen auch nurnoch an der Oberfläche(expression templates schneidet er Beispielsweise nicht an.)
-
wenn du templates mit expliziten argumenten fütterst, werden sie bis zum ende hin zusammengefasst, da sie nur noch konstante ausdrücke sind. daher wird der compiler tatsächlich bis 0.001 optimieren, wenn du ihn lässt. wenn du ihm die code-optimierung untersagst, wird er es lassen und den code "1/(10*10*10*1)" generieren und zur laufzeit auswerten.
-
Auch "Generative Programming - Methods, Tools and Applications" könnte für dich interessant sein, wenn du dich wirklich tief damit beschäftigen willst, aber das Buch ist wirklich keine leichte Kost und bietet auch noch deutlich mehr in die Richtung generative Programmierung als nur die Template-Metaprogrammierung.