/ / Ініціалізація двомірного масиву в класі через конструктор - c ++, масиви, конструктор, ініціалізація, c + + 14

Ініціалізація двомірного масиву в класі через конструктор - c ++, масиви, конструктор, ініціалізація, c + + 14

У мене є матричний клас, яким я хотів би бутиздатний ініціалізувати значення двомірного масиву даних з укладеного списку. Я вважаю, що можу це досягти, оголосивши 2D-масив перед викликом конструктора, а потім передаючи його як аргумент конструктора. Проте, я вважаю за краще, щоб я міг передати список укладеного в квадратний дух як аргумент.

template <class T, unsigned int N, unsigned int M>
class Matrix
{
T data[N][M];

Matrix(const T initMat[N][M])
{
for (unsigned int i=0; i<N; ++i)
{
for (unsigned int j=0; j<M; ++j)
{
data[i][j] = initMat[i][j];
}
}
}
};




const double arr[2][2] = {{1.0,2.0},{3.0,4.0}};
Matrix<double, 2, 2> matA(arr);    // Valid


Matrix<double, 2, 2> matB({{1.0,2.0},{3.0,4.0}});    // Invalid

Чи є спосіб досягти цього? Я намагався використовувати вставлені std :: масиви безрезультатно (мабуть, тому що вони діють так само, як і масиви c-стилів). Чи можна це досягти через список ініціалістів? (Я намагався використовувати init-списки, але я не впевнений, що вони не підходять або вони просто не поводяться, як я очікую їх.)

Я використовую gcc та c + + 14.

Відповіді:

5 за відповідь № 1

Додайте конструктор, як:

Matrix(std::array<std::array<T, M>, N> const& initMat) { ... }

І додати інший набір фігурних фігурних дужок (для std::array об'єкт):

Matrix<double, 2, 2> matB({{{1.0,2.0},{3.0,4.0}}});

Або використовувати std::initialize_list люблю:

Matrix(std::initializer_list<std::initializer_list<T>>){}

І тоді ви можете викинути круглі дужки (і одну пару фігурних дужок) з вищенаведеного визначення:

Matrix<double, 2, 2> matB{{1.0,2.0},{3.0,4.0}};

Недоліком цього є те, що розміри списків ініціалізатора не будуть виконані, тому я рекомендую перший варіант, використовуючи std::array.