Heim >Backend-Entwicklung >C++ >Wie kann ich einen Vorlagenkonstruktor explizit in einer C-Initialisiererliste aufrufen?

Wie kann ich einen Vorlagenkonstruktor explizit in einer C-Initialisiererliste aufrufen?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-03 04:56:12537Durchsuche

How Can I Explicitly Invoke a Template Constructor in a C   Initializer List?

Explizites Aufrufen eines Vorlagenkonstruktors in C

Das explizite Aufrufen eines Vorlagenkonstruktors in einer Initialisierungsliste kann in C eine Herausforderung sein. Trotz des bereitgestellten Beispiels:

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

struct U {
    U() : t<void>() {} //does not work
    T t;
};

Der Ansatz schlägt fehl, weil er versucht, die Syntax falsch zu interpretieren. Gemäß dem C-Standard (14.8.1/7) „gibt es keine Möglichkeit dazu, da die Liste der expliziten Vorlagenargumente dem Funktionsvorlagennamen folgt und weil Konvertierungs-Member-Funktionsvorlagen und Konstruktor-Member-Funktionsvorlagen ohne Verwendung eines Funktionsnamens aufgerufen werden.“ Stellen Sie eine explizite Vorlagenargumentliste für diese Funktionsvorlagen bereit.“

Das bedeutet, dass es nicht möglich ist, Vorlagenargumente direkt an Konstruktoren zu übergeben. Es gibt jedoch eine Problemumgehung:

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

struct U {
    U() : t(identity<void>()) {}
    T t;
};

In diesem Fall übergibt der Identitätstyp das Vorlagenargument effektiv über einen Vermittler an den Konstruktor.

Alternativ ist dies in C 20 und höher möglich Verwenden Sie den Typ std::type_identity:

struct T { 
    template<class U> T(std::type_identity<U>);
};

struct U {
    U() : t(std::type_identity<void>()) {}
    T t;
};

Durch die Verwendung dieser Problemumgehungen können Sie Vorlagenkonstruktoren effektiv explizit initialisieren Initialisierungslisten, trotz der durch den C-Standard auferlegten Einschränkungen.

Das obige ist der detaillierte Inhalt vonWie kann ich einen Vorlagenkonstruktor explizit in einer C-Initialisiererliste aufrufen?. 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