Template-Template-Parameter: Enthüllung der Geheimnisse
Im Bereich der Template-Programmierung kann das Konzept der Template-Template-Parameter wie ein Rätsel erscheinen. Der Versuch, sie zu verstehen, kann dazu führen, dass Sie sich verloren fühlen, als wären Sie in ein kompliziertes Puzzle verwickelt.
Stellen Sie sich vor, Sie stoßen auf den folgenden Codeausschnitt:
<code class="cpp">template<template<class X> class Z = B> class BB{};</code>
Hier die Parameterliste der Vorlagenklasse BB enthält die folgende Zeile:
<code class="cpp">template<class X> class Z = B</code>
Das Problem liegt in der Unterscheidung zwischen dem Z, das in der Parameterliste erscheint (d. h. dem Vorlagenparameter der Vorlage) und der hypothetischen Klasse Z, die durch die Vorlage definiert wird.
Den Unterschied verstehen
Template-Template-Parameter ähneln gewöhnlichen Template-Typ-Parametern, umfassen jedoch eher Templates als konkrete Typen.
Bedenken Sie beispielsweise Folgendes Code:
<code class="cpp">template <typename Type> class Foo { Type m_member; }; template <template <typename Type> class TemplateType> class Bar { TemplateType<int> m_ints; };</code>
Hier ist Foo eine einfache Vorlagenklasse, die einen Typparameter akzeptiert, während Bar eine Vorlagenvorlagenklasse ist, die eine Vorlage akzeptiert, die einen Typparameter akzeptiert.
Parallel zu Funktionszeigern
Template-Template-Parameter können mit Funktionszeigern verglichen werden. Reguläre Funktionen akzeptieren wertähnliche Argumente, genau wie reguläre Vorlagen Typen akzeptieren. Es gibt jedoch Funktionen höherer Ordnung, die Funktionszeiger akzeptieren, die wertähnliche Argumente empfangen, analog zu Vorlagenvorlagen, die Vorlagen akzeptieren, die Typen akzeptieren.
Warum Vorlagenvorlagen nicht möglich sind
Während es sicherlich Vorlagenvorlagen gibt, sind Vorlagenvorlagen kein gültiges Konzept in C. Aus Gründen der Implementierung hat sich das Standardisierungskomitee bewusst dafür entschieden, die Vorlagenrekursion auf eine Ebene zu beschränken. Diese Entscheidung verhindert jedoch nicht die Möglichkeit, sie in Zukunft einzuführen.
Weit hergeholte, aber faszinierende Anwendungen
Obwohl in der Praxis selten, haben Vorlagenvorlagen Potenzial Anwendungsfälle. Ein solches Beispiel ist der Entwurf eines äußerst generischen Algorithmus für die Graphsuche. Der Algorithmus könnte so geschrieben werden, dass er mit einer generischen Datenstruktur wie einem Stapel oder einer Warteschlange arbeitet und verschiedene zugrunde liegende Implementierungscontainer berücksichtigt. Dies würde die Erstellung benutzerdefinierter Diagrammsuchalgorithmen durch Typersetzungen ermöglichen, wie zum Beispiel:
<code class="cpp">search<Stack, Vector>( myGraph ); // DFS search<Queue, Deque>( myGraph ); // BFS</code>
Fazit
Um die Vorlagenparameter von Vorlagen zu verstehen, müssen Sie Ihre Perspektive auf Vorlagen verschieben als Konstrukte höherer Ordnung. Obwohl man sie vielleicht nicht häufig antrifft, bieten sie eine enorme Flexibilität für die Entwicklung anspruchsvoller Lösungen für komplexe Programmierprobleme.
Das obige ist der detaillierte Inhalt vonWas sind Template-Template-Parameter und warum sind Template-Templates in C nicht möglich?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!