如何从initializer_list初始化2D数组

时间:2018-10-03 16:06:17

标签: c++ initializer-list

typedef unsigned char u8;

template <u8 N>
class matrix {
    public:
        matrix(const std::initializer_list<std::initializer_list<int>>& l);
    private:
        std::array<std::array<int, N>, N> arr;
};

template <u8 N>
matrix<N>::matrix(const std::initializer_list<std::initializer_list<int>>& l) : arr(l) {}
  

错误C2664:   'std :: array,2> :: array(std :: array,2>   &&)':无法从'const转换参数1   std :: initializer_list>'为'const   std :: array,2>&'

如何从2D std::array初始化2D std::initializer_list(或C数组)?

1 个答案:

答案 0 :(得分:1)

y = x[start:stop:step] if step > 0 else x[stop:start:step] 是一个汇总。这意味着您可以通过 braced-init-list 之类的

对其进行初始化。
std::array

在构造函数中,尽管您没有 braised-init-list ,但您有一个std::array<int, 4> foo = {1,2,3,4}; ,该{}不能用于初始化std::initlizer_list。您需要做的是将数据从std::array复制到数组中,例如

std::initlizer_list

还请注意,您不必传递template <u8 N> matrix<N>::matrix(std::initializer_list<std::initializer_list<int>> l) { u8 counter = 0; for (auto row : l) std::copy(row.begin(), row.end(), arr[counter++].begin()); } 引用。这是一个轻量级的对象,按值传递可以,不会复制底层元素。


您可以更改类以将2d数组作为参数,以便您可以直接用其初始化std::initlizer_list,但是由于how you have to initialize aggregates of aggregates的原因,您会陷入大括号的境地,因为代码将变为

arr