Beste Einführung in die Metaprogrammierung von C ++ - Vorlagen? [geschlossen]

112

Statische Metaprogrammierung (auch als "Template-Metaprogrammierung" bezeichnet) ist eine großartige C ++ - Technik, mit der Programme zur Kompilierungszeit ausgeführt werden können. Eine Glühbirne ging in meinem Kopf aus, sobald ich dieses kanonische Metaprogrammierungsbeispiel las:

#include <iostream>
using namespace std;

template< int n >
struct factorial { enum { ret = factorial< n - 1 >::ret * n }; };

template<>
struct factorial< 0 > { enum { ret = 1 }; };

int main() {
    cout << "7! = " << factorial< 7 >::ret << endl; // 5040
    return 0;
}

Wenn Sie mehr über statische C ++ - Metaprogrammierung erfahren möchten, welche Quellen sind die besten (Bücher, Websites, Online-Kursunterlagen usw.)?

jwfearn
quelle
43
Glühbirne ging 'aus' oder 'an'?
Horseyguy
36
Aus. Auf jeden Fall aus.
Thomas Eding

Antworten:

108

[Beantwortung meiner eigenen Frage]

Die besten Einführungen, die ich bisher gefunden habe, sind Kapitel 10, "Statische Metaprogrammierung in C ++" aus Generative Programmierung, Methoden, Werkzeuge und Anwendungen von Krzysztof Czarnecki und Ulrich W. Eisenecker, ISBN-13: 9780201309775; und Kapitel 17, "Metaprogramme" von C ++ - Vorlagen: Der vollständige Leitfaden von David Vandevoorder und Nicolai M. Josuttis, ISBN-13: 9780201734843.

Alt-Text Alt-Text Alt-Text Alt-Text

Todd Veldhuizen verfügt über eine hervorragende Tutorial hier .

Eine gute Ressource für die C ++ - Programmierung im Allgemeinen ist Modern C ++ Design von Andrei Alexandrescu, ISBN-13: 9780201704310. Dieses Buch mischt ein wenig Metaprogrammierung mit anderen Vorlagentechniken. Insbesondere zur Metaprogrammierung siehe Abschnitte 2.1 "Zusicherungen zur Kompilierungszeit", 2.4 "Zuordnen integraler Konstanten zu Typen", 2.6 "Typauswahl", 2.7 "Erkennen von Konvertierbarkeit und Vererbung zur Kompilierungszeit", 2.9 " NullTypeund EmptyType" und 2.10 "Typmerkmale ".

Die beste Ressource für Fortgeschrittene, die ich gefunden habe, ist C ++ Template Metaprogramming von David Abrahams und Aleksey Gurtovoy, ISBN-13: 9780321227256

Wenn Sie nur ein Buch bevorzugen, besorgen Sie sich C ++ - Vorlagen: Das vollständige Handbuch, da es auch die endgültige Referenz für Vorlagen im Allgemeinen ist.

jwfearn
quelle
2
Der Link zu Todd Veldhuizens Stück ist abgestanden.
John R. Strohm
1
Link jetzt behoben, danke!
Jwfearn
Die Verbindung ist wieder unterbrochen!
Paul
1
Vielen Dank an @jwfearn, ich habe den Artikel gelesen, obwohl ich ihn interessanter fand: youtube.com/watch?v=Am2is2QCvxY (er besteht aus zwei Teilen). Es ist ein Vortrag von Walter E. Brown: Modern Template Metaprogramming: Ein Kompendium
Paul
24

Andrei Alexandrescus Modern C ++ Design- Buch behandelt viele dieser und anderer Tricks für schnellen und effizienten modernen C ++ - Code und ist die Grundlage für die Loki- Bibliothek.

Erwähnenswert sind auch die Boost- Bibliotheken, die diese Techniken häufig verwenden und normalerweise von sehr hoher Qualität sind, um daraus zu lernen (obwohl einige ziemlich dicht sind).

Alaric
quelle
12

Modernes C ++ - Design , ein brillantes Buch- und Designmuster-Framework von Alexandrescu. Wort der Warnung, nachdem ich dieses Buch gelesen hatte, hörte ich auf, C ++ zu machen und dachte: "Was zum Teufel, ich kann einfach eine bessere Sprache auswählen und sie kostenlos bekommen."

Florian Bösch
quelle
5
"Was zum Teufel, ich kann einfach eine bessere Sprache auswählen und sie kostenlos bekommen." Ähm, was meinst du? Ich bin besonders verwirrt von "kostenlos". Und welche andere Sprache hatten Sie im Sinn?
Pop Catalin
12
Die Metaprogrammierung von C ++ - Vorlagen bietet Ihnen alle möglichen neuen Funktionen wie das Übergeben von Typen oder die Liste von Typen als Argumente usw. Die meisten dieser Funktionen sind in dynamisch typisierten Sprachen wie Python mit einer besseren Syntax verfügbar.
Florian Bösch
1
Wenn Sie nach einer Sprache suchen, mit der Sie schnell korrekte Programme schreiben können, ist Python besser als C ++. Wenn Sie einige der anderen Dinge benötigen, die C ++ bietet, ist das Hinzufügen von Lisp-ähnlichen Funktionen zu C ++ möglicherweise besser als der Versuch, C ++ zu verwenden - wenn Sie eine andere Sprache verwenden.
David Thornley
6

Zwei gute Bücher, die mir in den Sinn kommen, sind:

  • Modernes C ++ - Design / Andrei Alexandrescu (Trotz des Namens ist es tatsächlich 7 Jahre alt!)
  • C ++ - Vorlagen: Der vollständige Leitfaden / Vandevoorde & Josuttis

Es ist ein ziemlich tiefgreifendes Feld, daher wird ein gutes Buch wie eines davon definitiv über Websites empfohlen. Bei einigen der fortgeschritteneren Techniken müssen Sie den Code einige Zeit studieren, um herauszufinden, wie sie funktionieren!

Nik
quelle
5

Modernes C ++ ist eine der besten Einführungen, die ich gelesen habe. Es werden aktuelle nützliche Beispiele für die Metaprogrammierung von Vorlagen behandelt. Schauen Sie sich auch die Begleitbibliothek Loki an .

Finsternis
quelle
5

Es wird keine große Liste von Büchern geben, da die Liste der Personen mit viel Erfahrung begrenzt ist. Die Metaprogrammierung von Vorlagen begann um den ersten C ++ - Workshop zur Vorlagenprogrammierung im Jahr 2000 und viele der bisher genannten Autoren nahmen daran teil. (IIRC, Andrei nicht.) Diese Pioniere haben das Feld stark beeinflusst, und im Grunde ist jetzt geschrieben, was geschrieben werden sollte. Persönlich würde ich Vandevoorde & Josuttis beraten. Alexandrescu's ist ein hartes Buch, wenn Sie neu auf dem Gebiet sind.

MSalters
quelle
4

Veldhuizens Originalpapiere waren gut. Wenn Sie Lust auf ein ganzes Buch haben, dann gibt es Vandevoordes Buch "C ++ Templates Complete Guide". Und wenn Sie für den Masterkurs bereit sind, probieren Sie Alexandrescus Modern C ++ Design.

nervös
quelle
4

google Alexandrescu, Modernes C ++ - Design: Generische Programmierung und angewandte Entwurfsmuster

Maxim Ananyev
quelle