Heim > Backend-Entwicklung > C++ > Wie rufe ich Vorlagenkonstruktoren explizit in C-Initialisierungslisten auf?

Wie rufe ich Vorlagenkonstruktoren explizit in C-Initialisierungslisten auf?

Linda Hamilton
Freigeben: 2024-11-27 08:28:10
Original
654 Leute haben es durchsucht

How to Explicitly Invoke Template Constructors in C   Initializer Lists?

Expliziter Aufruf von Vorlagenkonstruktoren in Initialisierungslisten

Wie können in C explizite Vorlagenkonstruktoren aufgerufen werden, wenn Objekte innerhalb eines Klassenkonstruktors initialisiert werden? Betrachten Sie das folgende Beispiel:

struct T { 
    template<class> T();
};

struct U {
    U() : t<void>() {} // This approach does not work
    T t;
};
Nach dem Login kopieren

Problemstellung

Der bereitgestellte Code versucht, den Vorlagenkonstruktor von T innerhalb der Initialisierungsliste von U explizit aufzurufen. Dieser Ansatz schlägt jedoch fehl.

Antwort

Das explizite Aufrufen von Vorlagenkonstruktoren in Initialisierungslisten wird in C nicht unterstützt. Diese Einschränkung ergibt sich aus der Tatsache, dass Vorlagenargumente normalerweise nach dem Namen der Funktionsvorlage in spitzen Klammern angegeben werden. Da Konstruktoren keine eigenen Namen haben, gibt es keine herkömmliche Möglichkeit, Vorlagenargumente an sie zu übergeben.

Erklärung

Der C-Standard weist ausdrücklich auf diese Einschränkung in Abschnitt 14.8.1/7 hin:

[Note: because the explicit template argument list follows the function template name, and because conversion member function templates and constructor member function templates are called without using a function name, there is no way to provide an explicit template argument list for these function templates. ]
Nach dem Login kopieren

Problemumgehungen

Eine Problemumgehung besteht darin, einen Hilfstyp zu verwenden, um das Vorlagenargument als Argument an a zu übergeben Konstruktor, der eine Typidentität akzeptiert. Zum Beispiel:

struct T { 
    template<class U> T(identity<U>);
};

struct U {
    U() : t(identity<void>()) {}
    T t;
};
Nach dem Login kopieren

In diesem Fall kann die in Boost definierte Identitätsvorlage verwendet werden, um das Vorlagenargument zu umschließen. Alternativ kann in C 20 der Typ std::type_identity verwendet werden.

Referenz

  • [std::type_identity](https://en.cppreference.com/w /cpp/types/type_identity)

Das obige ist der detaillierte Inhalt vonWie rufe ich Vorlagenkonstruktoren explizit in C-Initialisierungslisten auf?. 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