Heim >Backend-Entwicklung >C++ >Wie kann ich einen Vorlagenkonstruktor explizit in einer C-Initialisiererliste aufrufen?
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!