首頁 >後端開發 >C++ >如何在 C 中使用 `std::array` 模擬 C 風格的陣列初始化?

如何在 C 中使用 `std::array` 模擬 C 風格的陣列初始化?

Barbara Streisand
Barbara Streisand原創
2024-12-17 20:23:14609瀏覽

How Can I Mimic C-Style Array Initialization with `std::array` in C  ?

使用std::array 模擬C 陣列初始化

在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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn