#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