首頁  >  文章  >  後端開發  >  如何優雅地初始化非預設可構造類型的 std::array ?

如何優雅地初始化非預設可構造類型的 std::array ?

Patricia Arquette
Patricia Arquette原創
2024-10-30 09:53:27525瀏覽

How to Initialize `std::array` for Non-Default Constructible Types Elegantly?

std::array 的優雅初始化對於非預設可構造類型

在這種情況下,當包含的型別(T) 缺少預設建構函式時,初始化std::array 可能是一個挑戰。常見的解決方案是手動重複值來填充數組,對於較大的 n 值來說,這是一個乏味且容易出錯的過程。

幸運的是,有一種更優雅的方法,使用序列類型和自訂重複函數的組合。考慮以下程式碼:

<code class="cpp">template<typename T, int N>
void f(T value)
{
    // Generate a sequence of numbers: 0, 1, ..., N-1
    using genseq_t = genseq_t<N>;
    std::array<T, N> items = repeat(value, genseq_t{});
}</code>

genseq_t type 表示從 0 到 N-1 的數字序列,repeat 函數接受一個值和一個序列,傳回一個填滿該值的陣列。

repeat 函數的實作包括解包序列並重複該值對於每個元素,使用簡潔的語法:

<code class="cpp">template<typename T, int...N>
auto repeat(T value, seq<N...>) -> std::array<T, sizeof...(N)>
{
    // Unpack N, repeating 'value' sizeof...(N) times
    return {(N, value)...};
}</code>

使用push_back操作遞歸地定義genseq_t類型以建立序列:

<code class="cpp">template<int N>
struct genseq : genseq<N - 1>::type::template push_back<N - 1> {};</code>

自訂序列和重複函數提供了靈活的以及初始化std::array 的優雅解決方案具有非預設的可構造類型。

以上是如何優雅地初始化非預設可構造類型的 std::array ?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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