Partial Template Argument Deduction in C 17
Class Template Argument Deduction (CTAD) wurde in C 17 eingeführt, sodass der Compiler automatisch ableiten kann Vorlagenargumente basierend auf den Typen von Funktionsargumenten. Allerdings erfordert CTAD derzeit, dass alle Vorlagenargumente abgeleitet oder explizit angegeben werden. Ist es möglich, Vorlagenargumente teilweise anzugeben und die übrigen ableiten zu lassen?
Betrachten Sie das folgende Beispiel:
<code class="cpp">template<class T, class U, class V> struct Base { constexpr Base(T, U) {} constexpr Base(T, U, V) {} constexpr Base(V) {} }; void func() { constexpr Base val(1, 4.0, false); }</code>
Mit CTAD leitet der Compiler korrekt ab, dass val den Typ Base< hat ;int, double, bool>. Was aber, wenn wir die Vorlagenargumente teilweise angeben möchten, wie im folgenden Beispiel?
<code class="cpp"> constexpr Base<T = bool> val1(1, 4.0); // U & V deduced -> Base<int, double, bool> constexpr Base<T = bool, T = int> val2(5.0); // V deduced -> Base<bool, int, double></code>
Leider lässt sich dieser Code nicht kompilieren, da der Compiler erfordert, dass alle Vorlagenargumente entweder abgeleitet oder explizit angegeben werden .
Problemumgehungen
Da partielles CTAD nicht direkt unterstützt wird, gibt es einige Problemumgehungen, die wir verwenden können:
<code class="cpp">using NewBase2 = Base<double, int>; void func() { constexpr NewBase2 val(1, 2); }</code>
Fazit
Partielles CTAD wird in C 17 nicht direkt unterstützt, es stehen jedoch Workarounds zur Verfügung, um eine ähnliche Funktionalität zu erreichen. Der kommende C 20-Standard wird voraussichtlich Unterstützung für CTAD mit Alias-Vorlagen beinhalten, derzeit jedoch keine Unterstützung für partielles CTAD oder CTAD mit geerbten Konstruktoren.
Das obige ist der detaillierte Inhalt von## Kann C 17 Vorlagenargumente bei der Ableitung von Klassenvorlagenargumenten (CTAD) teilweise ableiten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!