簡體   English   中英

C ++使用構造函數參數初始化成員數組

[英]C++ Initialize Member Array with Constructor Argument

我有一個模板類,其中包含一個編譯時常量長度的單個成員數組。 我希望此數組為常數,但是很難根據構造函數提供的輸入對其進行初始化:

struct Input {
    int value;
};

template<size_t Size>
struct Foo {
    int const myVals[Size];
    Foo(std::array<Input, Size> const &in)
        : myVals{ in[0].value, in[1].value, /* How many times? */ } {
    }
}

由於我不知道數組的大小,因此我不知道有多少個值可用來初始化myVals 以下代碼有效,但我懷疑這是否是最佳方法:

template<size_t Size>
struct Foo {
    std::array<int, Size> const myVals;
    Foo(std::array<Input, Size> const &in)
        : myVals{ toIntArray(in) } {
    }
private:
    static std::array<int, Size> toIntArray(std::array<Input, Size> const &in) {
        std::array<int, Size> result;
        for (size_t i{ 0 }; i < Size; ++i) {
            result[i] = in[i].value;
        }
        return result;
    }
}

有沒有更簡潔的方法,或者通常被接受的方法來填充常量成員數組的值?

您可以使用std::index_sequence將數組的索引作為非類型模板參數包獲取。 然后,您可以使用參數包擴展。

template<size_t Size>
struct Foo {
    int const myVals[Size];
    Foo(std::array<Input, Size> const &in)
        : Foo(in, std::make_index_sequence<Size>()) { }
    private:
    template<size_t... Is>
    Foo(std::array<Input, Size> const &in, std::index_sequence<Is...>)
        : myVals{in[Is].value...} { }
}

將輔助模板與size_t... Is pack和std::index_sequence<Is...>參數一起使用是處理固定大小的可索引容器的常用模式。 index_sequence實際上什么也沒做; 它只是一個代理,因此可以推導出Is模板參數。 例如,如果您檢查Godbolt出現下完全蒸發-O1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM