Для класса мне нужен двумерный массив находящийся в одной области памяти. При этом я ещё собираюсь добавить конструктор перемещения и оператор перемещения, чтобы избежать множественного копирования данных.
На данный момент у меня только такой вариант:
Создать одномерный массив через динамическую память размером равным двумерному. И создать класс помощник для того чтобы мог обращаться к к элементам массива как к обычному двумерному массиву, с проверкой правильности индексов.
Вот небольшой пример:
Пример#include <iostream>
#include <vector>
template<size_t Y, size_t X>
class MyClass {
private:
class Indexing;
std::vector<int> arr;
public:
MyClass() : arr(Y * X, 0) {}
MyClass(MyClass&& other) {
arr = std::move(other.arr);
}
Indexing operator[](size_t index) {
if (index > Y) {
// бросаем исключение
}
return Indexing(&arr[index * X]);
}
};
template<size_t Y, size_t X>
class MyClass<Y, X>::Indexing {
private:
int* ptr;
public:
Indexing(int* ptr) : ptr(ptr) {}
int& operator[](size_t index) {
if (index > X) {
// бросаем исключение
}
return *(ptr + index);
}
};
int main() {
const size_t y = 3;
const size_t x = 4;
MyClass<y, x> a;
for (size_t i = 0; i < y; ++i) {
for (size_t j = 0; j < x; ++j) {
std::cout << a[i][j] << " ";
}
std::cout << std::endl;
}
return 0;
}
Но кажется, что как то это костыльно. Видел ещё пример где создают два динамических массива где один массив указателей и этим указателям присваивают адреса на участки памяти из другого динамического массива.