In der C-Programmierung kann die Array-Initialisierung mithilfe der Syntax int arr[] = { e1, e2, e3 vereinfacht werden , ... }, wobei die Anzahl der Elemente automatisch abgeleitet wird. Während std::array eine moderne Alternative zu C-Arrays darstellt, fehlt diese praktische Initialisierungsmethode. In diesem Artikel werden Techniken zur Emulation dieses Verhaltens mit std::array untersucht.
Ein Ansatz beinhaltet eine variable Vorlagenfunktion:
template<class T, class... Tail> auto make_array(T head, Tail... tail) -> std::array<T, 1 + sizeof...(Tail)> { std::array<T, 1 + sizeof...(Tail)> a = { head, tail ... }; return a; }
Diese Funktion benötigt einen Anfangselementkopf und eine beliebige Anzahl zusätzlicher Elemente als Schwanz. Es erstellt ein std::array der entsprechenden Größe und initialisiert es mit den bereitgestellten Elementen. Zum Beispiel der Code auto a = make_array(1, 2, 3); initialisiert ein std::array, das die Elemente 1, 2 und 3 enthält.
Dieser Ansatz stößt jedoch auf Einschränkungen. Es hängt von der Fähigkeit des Compilers ab, die Kopie des zurückgegebenen Werts zu optimieren, was möglicherweise nicht immer zuverlässig ist. Darüber hinaus können verschachtelte Typen nicht initialisiert werden, eine Funktion, die von der C-Array-Initialisierung unterstützt wird. Um diese Einschränkungen zu überwinden, ziehen Sie die folgenden Verbesserungen in Betracht:
#define ARRAY(...) make_array(__VA_ARGS__)
template<class T, class... Tail> auto make_array(std::array<T, Size> head, Tail... tail) -> std::array<T, Size + sizeof...(Tail)> { std::array<T, Size + sizeof...(Tail)> a = { head, tail ... }; return a; }
Mit diesen Verbesserungen wird die Initialisierung verschachtelter Typen möglich, wie z im Beispiel zu sehen:
#define ARRAY(...) make_array(__VA_ARGS__) struct A { int a; int b; }; auto arr = ARRAY(A{1, 2}, A{3, 4});
Diese Techniken bieten eine robuste Lösung für die Emulation der C-Array-Initialisierung mit std::array und ermöglichen eine bequeme und präzise Initialisierung von std::array-Objekten in modernem C-Code.
Das obige ist der detaillierte Inhalt vonWie kann ich die Array-Initialisierung im C-Stil mit „std::array' in C nachahmen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!