Как вывести два измерения матричного класса времени компиляции с помощью конструктора инициализатора_списка?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как вывести два измерения матричного класса времени компиляции с помощью конструктора инициализатора_списка?

Сообщение Anonymous »

#include
#include

template
class Matrix {

protected:

std::array matrix;

public:

constexpr Matrix() = default;

constexpr explicit Matrix(std::array matrix) : matrix(std::move(matrix)) { }

consteval Matrix(std::initializer_list matrix) : matrix() {
if (matrix.size() != Rows) {
throw std::invalid_argument("Invalid matrix Rows count");
}
auto current_row = matrix.begin();
for (size_t i = 0; i < matrix.size(); i++, current_row++) {
if (current_row->size() != Cols) {
throw std::invalid_argument("Invalid matrix column count");
}
std::copy(current_row->begin(), current_row->end(), this->matrix.begin());
}
}

constexpr auto& operator[](this auto&& self, size_t index) { return self.matrix[index]; }
};

template
struct Vector : Matrix {
using Matrix::Matrix;

template
consteval explicit Vector(U u, Us... us) {
this->matrix[0] = { u, us... };
}

constexpr auto& operator[](this auto&& self, size_t index) { return self.matrix[0][index]; }
};

template
Vector(T, U...) -> Vector;

int main() {
constexpr Matrix matrix {
{ 1, 2, 3 },
{ 1, 2, 3 },
{ 1, 2, 3 },
{ 1, 2, 3 }
};
static_assert(matrix[2][1] == 2);

constexpr Vector v { 1, 2, 3 };
static_assert(v[1] == 2);
}

Здесь довольно легко написать руководство по выводу для векторного класса, чтобы не указывать тип и количество элементов, но когда дело доходит до класса Matrix, это довольно сложно. Это связано с тем, что std::initializer_list::size для переданного Initializer_list не является постоянным выражением, и я не могу вывести из него аргумент Cols.
  • Как можно написать такое выражение и определить тип и размеры?

constexpr Matrix matrix {
{ 1, 2, 3 },
{ 1, 2, 3 },
{ 1, 2, 3 },
{ 1, 2, 3 }
};

  • Как можно написать такое выражение и вывести размеры, а типом содержащихся элементов быть элементы инициализатора, преобразованные в переданный тип ?

constexpr Matrix matrix {
{ 1, 2, 3 },
{ 1, 2, 3 },
{ 1, 2, 3 },
{ 1, 2, 3 }
};


Подробнее здесь: https://stackoverflow.com/questions/793 ... n-initiali
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»