Begonnen hat dies beim C++ Standardisierungstreffen 1994 in SanDiego. Hier meine persönliche Erinnerung:
Wir diskutierten über die Möglichkeiten, Template Argumente
aus einem Template zu bestimmen. Dabei kam die Frage hoch, ob das Inverse
einer Funktion bestimmt werden könnte. Ob also aus " I+1 ==
5 " geschlossen werden könnte, daß " I == 4 " ist. Dies wurde
verneint, aber die Frage inspirierte mich zu der Idee, während der
Übersetzung Primzahlen zu berechnen. Die erste Version bastelte ich
am Montag zusammen, aber sie war grundlegend falsch. Bjarne Stroustrup
meinte, so etwas würde prinzipiell nicht funktionieren.
Dies stachelte meinen Eifer an, und so hatte ich Mittwoch nachmittag
das Gerüst des Programmes fertig. Am Mittwoch abend war noch ein Arbeitstreffen
angesagt, wo ich etwas Luft hatte. Dort traf ich Tom Pennello, und wir
setzen uns zusammen. Er hatte seinen Notebook dabei und wir tippten mein
Programm kurz ein. Nach einigen Basteleien lief das Programm. Wir machten
einen Lauf und druckten Programm und Fehlermeldung
aus. Anschliessend kam Tom auf die Idee, doch eine kompliziertere Funktion
zu nehmen. Wir wählten die Ackermann Funktion. Nach wenigen Stunden
lief auch dies und berechnete den Wert der Ackermann-Funktion während
der Übersetzung.
Am Donnerstag zeigte ich den Ausdruck Bjarne. Er war äußerst
verblüfft. Ich fertigte dann Kopien für alle Teilnehmer an und
ließ dieses kuriose Programm offiziell verteilen. Ich hielt das ganze
für einen Scherz.
Ein paar Wochen später entwickelte ich einen Beweis, daß der Template-Mechanismus Turing-vollständig ist. Da dieser Beweis jedoch recht trocken war, habe ich ihn einfach zu den Akten gelegt. Die Notizen habe ich immer noch. Bei Gelegenheit werde ich diese mal eintippen und hier zur Verfügung stellen.
Später griff Todd Veldhuizen die Idee auf und veröffentlichte
einen Artikel
im C++ Report. Dieser erschien im Mai 1995. Er begriff die Möglichkeiten,
die hinter der Idee stecken und setzte diese in konkrete Metaprogramme
um, die etwas konstruktives machen.
Dieser Artikel war die Basis, auf der die Template-Metaprogrammierung
aufgebaut wurde. Ich gab zwar den Anstoss, erkannte aber nicht die Reichweite
der Idee.