Многомерный список инициализаторов, заключенный в фигурные скобки, в мультивектор

То, что я хочу, - это возможность генерировать матрицу 5x5 с помощью списка инициализаторов, заключенного в фигурные скобки. Чтобы потом это выглядело так:

enum class MyListType  {
  EMPTY,
  A
};

auto matrix = {
  {MyListType::EMPTY, MyListType::EMPTY, MyListType::EMPTY, MyListType::EMPTY, MyListType::EMPTY},
  {MyListType::A, MyListType::A, MyListType::A, MyListType::A, MyListType::A},
  {MyListType::A, MyListType::A, MyListType::A, MyListType::A, MyListType::A},
  {MyListType::A, MyListType::A, MyListType::A, MyListType::A, MyListType::A},
  {MyListType::EMPTY, MyListType::EMPTY, MyListType::EMPTY, MyListType::EMPTY, MyListType::EMPTY}
};

auto somthing = std::make_shared<Matrix5T>(matrix);

Для этого у меня есть класс Matrix5T, который пока работает только для векторов:

class Matrix5T
{
public:
  Matrix5T(std::initializer_list<MyListType> matrixIn)
    : matrix(std::make_shared<std::vector<MyListType> >(matrixIn))
  {}

  virtual ~TileMatrix() = default;

private:
  std::shared_ptr<std::vector<MyListType> > matrix;
}

Итак, я могу сделать следующее:

auto matrix = {
  MyListType::EMPTY, MyListType::EMPTY, MyListType::EMPTY, MyListType::EMPTY, MyListType::EMPTY,
  MyListType::A, MyListType::A, MyListType::A, MyListType::A, MyListType::A,
  MyListType::A, MyListType::A, MyListType::A, MyListType::A, MyListType::A,
  MyListType::A, MyListType::A, MyListType::A, MyListType::A, MyListType::A,
  MyListType::EMPTY, MyListType::EMPTY, MyListType::EMPTY, MyListType::EMPTY, MyListType::EMPTY
};

auto somthing = std::make_shared<Matrix5T>(matrix);

На данный момент я не нахожу решения, чтобы многомерный вектор в моем классе был инициализирован многомерным списком инициализаторов, заключенным в фигурные скобки.

Я пробовал, например, следующее, что приводит к ошибкам:

class Matrix5T
{
public:
  Matrix5T(std::initializer_list<std::initializer_list<MyListType> > matrixIn)
    : matrix(std::make_shared<std::vector<std::vector<MyListType> > >(matrixIn))
  {}

  virtual ~TileMatrix() = default;

private:
  std::shared_ptr<std::vector<std::vector<MyListType> > > matrix;
}

Ошибка говорит о том, что преобразование из списка инициализаторов в многомерный вектор не работает:

no known conversion for argument 1 from ‘std::initializer_list<std::initializer_list<MyListType> >’ to ‘const std::vector<std::vector<MyListType> >&’

Итак, как я могу это исправить?


person lucy codes    schedule 29.08.2015    source источник


Ответы (1)


Вы должны иметь возможность использовать конструктор диапазона:

Matrix5T(std::initializer_list<std::initializer_list<MyListType>> matrixIn)
    : matrix(std::make_shared<std::vector<std::vector<MyListType>>>(matrixIn.begin(),
                                                                    matrixIn.end())) {}
person T.C.    schedule 29.08.2015