У мене є матричний клас, яким я хотів би бутиздатний ініціалізувати значення двомірного масиву даних з укладеного списку. Я вважаю, що можу це досягти, оголосивши 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
.