在C 程式設計中,可以使用語法int arr[] = { e1, e2, e3 來簡化陣列初始化, ... },其中元素的數量是自動推斷的。雖然 std::array 提供了 C 數組的現代替代方案,但它缺乏這種方便的初始化方法。本文探討了使用 std::array 模擬此行為的技術。
一種方法涉及可變參數模板函數:
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; }
此函數採用初始元素頭和任意數量的附加元素作為尾巴。它創建一個適當大小的 std::array,並使用提供的元素對其進行初始化。例如,程式碼 auto a = make_array(1, 2, 3);初始化一個包含元素 1、2 和 3 的 std::array。
但是,這種方法面臨限制。它依賴於編譯器優化傳回值副本的能力,這可能並不總是可靠的。此外,它無法初始化巢狀類型,這是 C 數組初始化支援的功能。要克服這些限制,請考慮以下改進:
#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; }
使用這些改進,巢狀類型初始化成為可能,如範例所示:
#define ARRAY(...) make_array(__VA_ARGS__) struct A { int a; int b; }; auto arr = ARRAY(A{1, 2}, A{3, 4});
這些技術提供了一個強大的解決方案,用於使用std::array 模擬 C 陣列初始化,因此可以在現代 C 程式碼中方便、簡潔地初始化 std::array 物件。
以上是如何在 C 中使用 `std::array` 模擬 C 風格的陣列初始化?的詳細內容。更多資訊請關注PHP中文網其他相關文章!