Heim  >  Artikel  >  Backend-Entwicklung  >  ## Kann C 17 Vorlagenargumente bei der Ableitung von Klassenvorlagenargumenten (CTAD) teilweise ableiten?

## Kann C 17 Vorlagenargumente bei der Ableitung von Klassenvorlagenargumenten (CTAD) teilweise ableiten?

Susan Sarandon
Susan SarandonOriginal
2024-10-25 07:23:02200Durchsuche

## Can C  17 Partially Deduce Template Arguments in Class Template Argument Deduction (CTAD)?

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:

  • Erstellen Sie Alias-Vorlagen für spezifische Argumentkombinationen, wie im folgenden Beispiel gezeigt:
<code class="cpp">using NewBase2 = Base<double, int>;

void func() {
  constexpr NewBase2 val(1, 2);
}</code>
  • Verwenden Sie Vorlagen-Metaprogrammierungstechniken, um die entsprechende Vorlage basierend auf den teilweise angegebenen Argumenten bedingt auszuwählen.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn