Teilweise Ableitung von Klassenvorlagenargumenten in C 17
Die C 17-Funktion „Klassenvorlagenargumentableitung“ (CTAD) ermöglicht Compilern die automatische Ableitung die Vorlagenargumente einer Klasse, wenn sie instanziiert wird. Dies vereinfacht den Code und macht die Angabe expliziter Vorlagenargumente überflüssig.
Können wir jedoch teilweise Vorlagenargumente angeben und den Rest ableiten lassen?
Lösungsversuch 1:
Ein Versuch, einen teilweisen Abzug zu erreichen, besteht darin, eine Alias-Vorlage wie folgt zu erstellen:
<code class="cpp">template<class T, class U> using Base2 = Base<T, U, double>;</code>
Dann verwenden Sie den Alias, um die Argumente teilweise anzugeben:
<code class="cpp">void func() { Base2 val(1, 2); }</code>
Allerdings Dies führt zu einem Kompilierungsfehler, der darauf hinweist, dass die Verwendung einer Alias-Vorlage eine vollständige Liste der Vorlagenargumente erfordert.
Problemumgehungen:
Leider wird der teilweise Abzug in nicht direkt unterstützt C 17. Es stehen jedoch einige Problemumgehungen zur Verfügung:
1. Überladungs-Hilfsfunktionen:
Erstellen Sie Überladungsfunktionen mit verschiedenen Sätzen angegebener Argumente und verwenden Sie die spezifischste Überladung für den Abzug:
<code class="cpp">template<class T, class U> void func(Base<T, U> val) { } template<class T> void func(Base<T, double> val) { } template<> void func(Base<double> val) { }</code>
2. Explizite Argumentableitung:
Verwenden Sie die explizite Vorlagenargumentableitung, um bestimmte Argumente anzugeben, während Sie die anderen ableiten:
<code class="cpp">Base val(1, static_cast<double>(4.), false);</code>
3. Verwenden Sie variadische Vorlagen:
Erstellen Sie eine variadische Vorlage, die mehrere Argumente akzeptiert und die Vorlagenargumente ableiten kann:
<code class="cpp">template<typename... Args> class Base { public: Base(Args&&... args) { // Custom logic to deduce template arguments from args... } };</code>
Fazit:
Der teilweise Abzug von Klassenvorlagenargumenten wird in C 17 nicht direkt unterstützt. Durch die Verwendung von Problemumgehungen wie Funktionsüberladung, explizitem Abzug oder variadischen Vorlagen ist es jedoch möglich, einen ähnlichen Effekt zu erzielen.
Das obige ist der detaillierte Inhalt von## Können wir Vorlagenargumente für Klassenvorlagen in C 17 teilweise ableiten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!