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; };
Der bereitgestellte Code versucht, den Vorlagenkonstruktor von T innerhalb der Initialisierungsliste von U explizit aufzurufen. Dieser Ansatz schlägt jedoch fehl.
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.
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. ]
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.
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!