Betrachten Sie den folgenden Code:
struct A
{
// No data members
//...
};
template<typename T, size_t N>
struct B : A
{
T data[N];
}
So müssen Sie B initialisieren: B<int, 3> b = { {}, {1, 2, 3} };
Ich möchte das unnötige leere {} für die Basisklasse vermeiden. Es gibt eine Lösung von Jarod42 vorgeschlagen hier jedoch nicht mit Elementen Standardinitialisierung funktioniert: B<int, 3> b = {1, 2, 3};
ist gut , aber B<int, 3> b = {1};
nicht ist: b.data[1]
und b.data[2]
ist nicht auf 0 initialisiert default und ein Compiler - Fehler auftritt. Gibt es eine Möglichkeit (oder wird es mit c ++ 20 geben), die Basisklasse vor der Konstruktion zu "verstecken"?
c++
initialization
c++20
aggregate-initialization
user7769147
quelle
quelle
template<class... Ts> B(Ts... args) : data{args...} {}
?Antworten:
Die einfachste Lösung besteht darin, einen variadischen Konstruktor hinzuzufügen:
Wenn Sie in der
{...}
Initialisierungsliste weniger Elemente als angebenN
, werden die verbleibenden Elemente im Array wiedata
folgt mit dem Wert initialisiertT()
.quelle
B<Class, 5> b = {Class()};
Class
wird zuerst erstellt und dann verschoben, während unter Verwendung der aggregierten InitialisierungClass
an Ort und Stelle erstellt werden würde, ist keine Verschiebungstd::tuple
Argumente verwenden und sie verwenden, um Objekte direkt zu erstellen. Die Syntax ist jedoch ziemlich umständlich.Da C ++ 20 Sie nutzen könnten bezeichnet initializers in Aggregat Initialisierung .
quelle
Noch mit dem Konstruktor können Sie Folgendes tun:
Demo
SFINAE wird hauptsächlich durchgeführt, um zu vermeiden, dass ein Pseudokopiekonstruktor erstellt wird
B(B&)
.Sie würden zusätzliche private Tags benötigen, um zu unterstützen
B<std::index_sequence<0, 1>, 42>
;-)quelle
((void)Is, T())...
? Was ist, wenn Sie es einfach weglassen? Werden die verbleibenden Elemente nichtT()
standardmäßig mit einem Wert initialisiert ?Ich habe eine andere Lösung gefunden, die (ich weiß nicht wie) perfekt funktioniert und das Problem löst, das wir unter Evgs Antwort besprochen haben
quelle
this->data
oderusing B_data::data;
darauf zugreifen .data
B