Heim > Backend-Entwicklung > C++ > ## Können wir Vorlagenargumente für Klassenvorlagen in C 17 teilweise ableiten?

## Können wir Vorlagenargumente für Klassenvorlagen in C 17 teilweise ableiten?

Mary-Kate Olsen
Freigeben: 2024-10-25 07:36:29
Original
756 Leute haben es durchsucht

## Can We Partially Deduce Template Arguments for Class Templates in C  17?

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>
Nach dem Login kopieren

Dann verwenden Sie den Alias, um die Argumente teilweise anzugeben:

<code class="cpp">void func() {
    Base2 val(1, 2);
}</code>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage