C++-Metaprogrammierung ist eine Technik der Metaprogrammierung in C++. Dabei kommen besonders Templates zum Einsatz, auch als Templatemetaprogrammierung bezeichnet. Es gibt aber auch Metaprogrammierung über C Macros.
Dabei macht man sich zu nutze, dass Templates während des Compilierprozesses ausgewertet werden. So kann man mit Hilfe von Templatespezialisierung Code schreiben, der zur Compilezeit ausgewertet wird und erst den eigentlichen Code generiert. Dies verlängert zwar die Dauer des compilierens, verkürzt aber die Laufzeit.
Die Templatemetaprogrammierung ist ein sehr mächtiges Feature und wurde für C++ relativ gut studiert und erforscht. So gibt es zum Beispiel eine Implementierung eines Lisp-Derivats [1] oder ein Parserframework [2] direkt in C++-Templates. Andrei Alexandrescu gilt als einer der Vordenker dieser Technik, die er besonders mit seinem Buch Modern C++ Design bekannt machte.
Besonders die Boost-Bibliotheken enthält viel Code für die Templatemetaprogrammierung.
Beispiel
Potenzberechnung in Templates.
#include <iostream>
template<long B,unsigned long E>
struct pow_helper {
static const double value;
};
template<long B,unsigned long E>
const double pow_helper<B,E>::value=B*pow_helper<B,E-1>::value;
template<long B>
struct pow_helper<B,0> {
static const double value;
};
template<long B>
const double pow_helper<B,0>::value=1;
template<long B,long E>
struct power {
static const double value;
};
template<long B,long E>
const double power<B,E>::value= E<0 ? 1.0/pow_helper<B,E<0 ? -E : E>::value :
pow_helper<B,E<0 ? -E : E>::value;
int main() {
std::cout << power<10,-3>::value << std::endl;
}
Weblinks
Bücher
- Andrei Alexandrescu: Modernes C++ Design - Generische Programmierung und Entwurfsmuster angewendet, mitp, ISBN 3-8266-1347-3, das Standardwerk zur C++-Metaprogrammierung
- David Vandervoorde, Nicolai M. Josuttis: C++ Templates: The Complete Guide, Addison-Wesley Professional, ISBN: 0-2017-3484-2