C ++使用构造函数参数初始化成员数组

时间:2019-04-29 17:52:50

标签: c++ arrays initialization

我有一个模板类,其中包含一个编译时常量长度的单个成员数组。我希望此数组为常量,但是根据构造函数提供的输入对其进行初始化非常困难:

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;
    }
}

填充常数成员数组的值是否有更简洁或普遍接受的方法?

1 个答案:

答案 0 :(得分:0)

您可以使用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包和std::index_sequence<Is...>参数的辅助模板是处理固定大小的可索引容器的常见模式。 index_sequence实际上什么也没做;它只是一个代理,因此可以推导Is模板参数。例如。如果您check on Godbolt-O1下似乎完全蒸发了。