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

Wie rufe ich Vorlagenkonstruktoren explizit in C-Initialisierungslisten auf?

Linda Hamilton
Linda HamiltonOriginal
2024-11-27 08:28:10726Durchsuche

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;
};

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. ]

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;
};

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!

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