Init std::array in class constructor initializer list : 如果默认构造函数不可用,则用固定的 class 填充值

Init std::array in class constructor initializer list : fill values with a fixed class if default constructor is not available

我有 std::array 个 类,如下所示:

class Elem {
private:
    int data_;
public:
    Elem(int data) : data_(data) {}
    Elem() = delete;
};

class A {
private:
    static const int N = 3;
    std::array<Elem, N> x_;
public:
    A() : x_{ { Elem(0), Elem(0), Elem(0) } } {}
};

上面的代码似乎可以工作,但是如果 'N' 很大,初始化需要太多的手动工作:

A() : x_{ { Elem(0), Elem(0), Elem(0), Elem(0), Elem(0), ... } } {}

有没有办法用固定的Elem填充数组?注意 Elem 没有默认构造函数。我无法使用任何其他 STL 容器。

此外,建议的解决方案需要 C++11(因为数组初始化在'''A''' ctor 中)。是否有 C++03 的解决方法(即使用 VS2013)?

谢谢

埃马努埃莱

这是一个使用 std::index_sequence 和包扩展的 C++14 解决方案。将它移植到 C++11 应该不会太难,但不确定它是否可以移植到 C++03。

template <std::size_t... Is, typename F>
auto makeArrayWithHelper(std::index_sequence<Is...>, F&& f)
{
    return std::array<decltype(f()), sizeof...(Is)>{((void)Is, f())...};
}

template <std::size_t N, typename F>
auto makeArrayWith(F&& f)
{
    return makeArrayWithHelper(std::make_index_sequence<N>{}, std::forward<F>(f));
}

class A {
private:
    static const int N = 3;
    std::array<Elem, N> x_;
public:
    A() : x_{makeArrayWith<N>([]{ return Elem(0); })} {}
};

live example on godbolt.org