Ich habe mich entschlossen, meine Kenntnisse in der Meta-Programmierung von Vorlagen zu verbessern. Ich kenne die Syntax und die Regeln und habe mit unzähligen Beispielen aus Online-Ressourcen gespielt.
Ich verstehe, wie leistungsfähig Vorlagen sein können und wie viel Optimierung der Kompilierungszeit sie bieten können, aber ich kann immer noch nicht "in Vorlagen denken". Ich kann anscheinend nicht selbst wissen, ob ein bestimmtes Problem mit Vorlagen am besten gelöst werden kann und ob dies möglich ist. wie man dieses Problem an Vorlagen anpasst.
Gibt es eine Art Online-Ressource oder ein Online-Buch, in dem Sie lernen, wie Sie Probleme identifizieren, die am besten mit Vorlagen gelöst werden können, und wie Sie dieses Problem anpassen können?
Antworten:
Bücher:
Modernes C ++ - Design
C ++ - Vorlagen-Metaprogrammierung
Mit Rekursion und funktionaler Programmierung vertraut zu sein, ist ein großes Plus, da dies bei viel tmp eine Rolle spielt. Es ist vollständig und so ist im Wesentlichen alles möglich, obwohl es normalerweise darauf hinausläuft, reine Funktionen auf Konstanten anzuwenden oder Typen aus anderen Typen zu generieren.
Achtung: tmp ist ein hässliches Monster, das schönen Code in Spaghetti verwandelt. Je mehr Sie es verwenden, desto weniger wird Ihnen C ++ gefallen. Es ist eine böse Sache.
quelle
Lernen Sie Haskell oder eine andere reine Funktionssprache (Lisp, Scheme, OCaml, um nur einige zu nennen, mehr finden Sie auf Wikipedia ).
In Anbetracht Haskell, können Sie mehr Informationen über sie die metaprogramming Einrichtungen finden sich hier .
Die Vorlagenprogrammierung folgt weitgehend denselben Regeln.
quelle
Nur weil Sie etwas mit Vorlagen tun können, heißt das nicht, dass Sie es tun sollten. In der Praxis ist es wahrscheinlich besser, sie nicht zu verwenden, es sei denn, Sie entwerfen beim Entwerfen, dass dies ein großartiger Job für Vorlagen ist. Wenn Sie zu viel in Vorlagen denken, erstellen Sie einfach wahnsinnig abstrahierten Code, der genauso schlecht ist wie eine einzelne Riesenfunktion.
quelle
Beachten Sie, dass Vorlagen die beste Lösung sind. Ich habe meine eigene in den letzten 5 Jahren nur einmal definiert, und meine Kollegen, die diesen Code überprüft haben, haben dies nie getan. Die Fälle, in denen Vorlagen sehr sinnvoll sind, wurden größtenteils bereits in Standardbibliotheken implementiert.
Bei der generischen Programmierung sollten Sie darauf achten, dass Sie Funktionen kopieren und einfügen, um nur geringfügige Änderungen vorzunehmen, z. B. an Konstanten oder Typen, und keine saubere Methode finden, um Vererbungs- oder Funktionsparameter zu verwenden, um Wiederholungen zu vermeiden du selber.
Eine ziemlich häufige Art und Weise, wie Vorlagen verwendet werden, ist die Typensicherheit, wenn Sie Typen haben, die sich gleich verhalten, aber aus irgendeinem Grund nicht versehentlich verwechselt werden sollen.
Bei der Berechnung der Kompilierungszeit mithilfe von Vorlagen sollten Sie auf ressourcenintensive Berechnungen achten, bei denen alle Eingaben zur Kompilierungszeit bekannt sind, bei denen jedoch unterschiedliche konstante Eingaben an verschiedenen Stellen im Code verwendet werden. Beachten Sie jedoch, dass dies Ihre Kompilierungen jedes Mal verlangsamt. Daher ist es häufig vorzuziehen, die Ergebnisse nur manuell hart zu codieren, wenn sie sich nicht sehr oft ändern.
Einige Befürworter verwenden Vorlagen für Mikrooptimierungen wie das Vermeiden der Suche nach virtuellen Tabellen mithilfe statischen Polymorphismus oder zum Abrollen von Schleifen. Meiner Meinung nach überwiegt die Komplexität jedoch normalerweise die Leistungssteigerung, es sei denn, Ihr Code ist sehr leistungskritisch.
quelle
Grundsätzlich gibt es mehrere gute Gründe, Vorlagen zu verwenden:
quelle
Sie sollten sich unbedingt Vorlagen in C ++ ansehen! Dies wird Ihnen sehr helfen, Themen wie Entwurfsmuster und generische Programmierung zu verstehen. Vergleichen Sie sie mit dem, was andere Sprachen Ihnen bieten. Genau genommen sollten Sie Vorlagen verwenden, insbesondere in den folgenden Szenarien:
Hier ist eine gute Online-Ressource für Sie: http://en.wikipedia.org/wiki/Generic_programming#Templates_in_C.2B.2B
quelle
Ein einfacher Indikator dafür, wann eine Vorlage Ihren Code verbessern würde, ist, wenn Sie feststellen, dass Ihr Code häufig erfordert, dass Sie ein Objekt in einen anderen Typ umwandeln. Ein Beispiel, das ich in meinem eigenen Java-Code gefunden habe und das mich dazu veranlasste, eine vorhandene Methodensignatur in eine Vorlage zu konvertieren:
Mein Kundencode sah immer so aus:
und wann immer ich diese Methode verwendete, musste ich das Ergebnis in die richtige Unterklasse des MsgBase-Typs umwandeln. Die verbesserte Methodensignatur war:
Jetzt war der Client-Code:
Zusammenfassend lässt sich sagen, dass Sie möglicherweise einen guten Fall haben, in dem eine Vorlage Ihren Code bereinigt, wenn Sie viel Casting durchführen, was unnötig erscheint.
Update: Ein besserer Weg, um die obige Aussage zu verallgemeinern:
quelle
Erst heute habe ich Vorlagen verwendet, um eine Finite-State-Maschine zu implementieren, um einige Eingaben zu lexen. Ausdrucksvorlagen sind äußerst leistungsfähige Werkzeuge für die Implementierung solcher Codekonzepte. Sie laufen wie handoptimiertes C ++ und sind unglaublich schnell, aber sehr allgemein und sehr einfach zu schreiben.
Im Allgemeinen sind Vorlagen bei der Implementierung generischer Algorithmen am sinnvollsten. Wenn Sie keinen generischen Algorithmus implementieren, sind diese nicht so sinnvoll.
quelle
Vorlagen werden am häufigsten wie folgt verwendet:
Das nächste häufige Beispiel ist:
Zusammen mit dieser Art der Nutzung:
Dieser zeigte einen wichtigen Teil der Vorlagen, nämlich die Typersetzung - T wird an beiden Stellen, an denen er verwendet wird, durch den Float-Typ ersetzt.
quelle