Waren SFINAE und Metaprogrammierung in C ++ beabsichtigt oder nur ein Nebenprodukt von Vorlagen?

11

SFINAE und templateMetaprogrammierung können wunderbare Dinge bewirken, und viele Bibliotheken nutzen sie auch erheblich.

Historisch gesehen wurden diese beiden "magischen Konzepte" absichtlich in C ++ eingeführt / unterstützt? Oder wurden sie erst später als nützliche Nebenprodukte (Nebenprodukte) der ursprünglichen templateProgrammierung entdeckt?

iammilind
quelle

Antworten:

19

Vor ungefähr einem Jahrzehnt, nach einem Konferenztag, befand ich mich zufällig mit Erwin Unruh und einigen anderen in einer Kneipe und fragte ihn nach dem Programm, das VJovic erwähnte . Bis dahin haben wir ein paar Biere getrunken, es war ein inoffizielles Treffen, und es hat ein Jahrzehnt in meinem Kopf gelebt, also nimm das mit einem Körnchen Salz, aber nach meinen Erinnerungen:

Er sagte, dass sie Vorlagenfunktionen hinzugefügt hätten, um die STL besser bedienen zu können. Ihm zufolge hatten einige / viele im Ausschuss das Gefühl, etwas zu schaffen, ohne seine vollen Fähigkeiten zu kennen. Er selbst vermutete, dass all das Vorlagenmaterial, insbesondere die teilweise Spezialisierung, eine Turing-vollständige Sprache bildete, und er wollte immer einen formalen Beweis dafür erbringen, kam aber nie dazu.

Stattdessen kam er eines Nachts bei einem Standardisierungstreffen auf das Programm, das Primzahlen als Fehlermeldungen druckte (eine Version, die mit modernen Compilern funktionieren sollte, ist hier ), die es während der Kompilierung berechnete. Als Template-Metaprogramm ist es nach heutigen Maßstäben nicht sehr beeindruckend, aber es war immerhin eine Premiere. Jemand machte das, was er für einen Witz hielt, indem er das Programm offiziell einreichte, sodass es zu einem offiziellen ISO-Standardisierungsdokument wurde.

Ich erinnere mich, dass ich ihn speziell nach Bjarne Stroustrups Reaktion auf das Programm gefragt habe, und als Antwort ahmte Erwin ihn nach, indem er seine Augen mit der Hand bedeckte. :)

Im Nachhinein bedauere ich, dass ich Todd Veldhuizen , der auch an dieser Konferenz teilnahm, nicht gefragt hatte , wie er auf Ausdrucksvorlagen gekommen war . (Er war auf jeden Fall ein netter Kerl, mit dem man reden konnte.) Aber ich war viel jünger als und ließ die Gelegenheit fürs Leben aus.:(

sbi
quelle
+1, interessante Erfahrung. Haben sie damals etwas über SFINAE gesprochen?
Iammilind
@iammilind: Ich denke, SFINAE ist nur eine der Funktionen, die er erwähnt hat, um die STL besser zu unterstützen, obwohl der Moniker "SFINAE" erst Jahre später geprägt wurde.
sbi
11

Während einer Sitzung des c ++ - Standardisierungsausschusses im Jahr 1994 entdeckte E. Unruh, dass Vorlagen verwendet werden können, um etwas zur Kompilierungszeit zu berechnen. Er schrieb ein Programm, das Primzahlen druckt. Der faszinierende Teil dieser Übung war, dass die Erstellung der Primzahlen vom Compiler während des Kompilierungsprozesses und nicht zur Laufzeit durchgeführt wurde. Obwohl dieses Programm nicht vollständig portierbar war, zeigte das Programm, dass der Mechanismus zur Instanziierung von Vorlagen eine primitive rekursive Sprache ist, die zur Kompilierungszeit nicht triviale Berechnungen durchführen kann.

Dieser Auszug stammt aus "c ++ - Vorlagen" von Vandevoorde und Josuttis (Kapitel 17).

Wie Sie sehen können, wurde es früh entdeckt und seine Kraft wurde sofort erkannt.

BЈовић
quelle
2
Gut. Diese Art von Artikel habe ich auch im Internet gelesen, erinnere mich nicht an die Quelle. Gilt das auch für SFINAE?
Iammilind
@iammilind Was meinst du mit "Gilt das auch für SFINAE?"
BЈовић
1
SFINAE benötigt im Allgemeinen Unterstützung vom Compiler. Es ist also möglich, dass es nicht versehentlich entdeckt wurde.
Iammilind
@iammilind Ich fand einen Artikel von informit, der einen ähnlichen Text aus dem Buch enthält: informit.com/articles/article.aspx?p=30667&seqNum=8
BЈовић
@iammilind Die Antwort wurde bearbeitet. Ich würde sagen, es war aus Versehen, weil die Unterstützung der Compiler für Vorlagen begrenzt war. Das Programm war nicht portabel, und ich denke, es funktionierte nur auf einem Compiler
BЈовић