Перегрузка — C ++ Возможно ли иметь динамические элементы данных по умолчанию

Я хотел бы создать класс Image, который может перегружать операторы доступа к массиву, так что вы можете сделать что-то вроде:

Image<unsigned long> img(100, 100); // an image 100x100
unsigned long middlePixel = img[50][50]; // access at (50,50)

Чтобы учесть второй оператор доступа к массиву, мне пришлось вернуть структуру «proxy», которая снова имеет перегрузку другого оператора доступа к массиву.

(В классе изображений):

inline auto operator[] (int x)
{
struct
{
T *col;

inline T operator[] (int y) { return col[y]; }
} proxy{ raster[x] };
return proxy;
}

Это решение в настоящее время работает; однако он представляет столбец изображения col как открытый член анонимной структуры. Я хотел бы сделать это анонимным классом так, чтобы ‘col’ был приватным (или сделать сам член приватным в структуре).

Проблема в том, что я не уверен, как инициализировать ‘col’. Я понимаю, что могу также установить ‘col’ с помощью функции setter в анонимной структуре, но я хотел бы сделать анонимную структуру, которая имеет только открытую перегрузку доступа к массиву.

Я надеялся, что смогу выполнить что-то вроде этого (ofc не компилируется):

inline auto operator[] (int x)
{
class
{
T *col = raster[x];
public:
inline T operator[] (int y) { return col[y]; }
} proxy;
return proxy;
}

Возможно ли такое решение, не называя мою структуру?

Код ссылки:

template <class T = unsigned long>
class Image
{
private:
int width, height;
T **raster;
public:
Image(const int width, const int height) : width(width), height(height)
{
raster = new T*[height];
for (int y = 0; y < height; y++)
raster[y] = new T[width];
}

~Image()
{
for (int y = 0; y < height; y++)
delete[] raster[y];
delete[] raster;
}

inline auto operator[] (int x)
{
struct
{
T *col;

inline T operator[] (int y) { return col[y]; }
} proxy{ raster[x] };
return proxy;
}
};

Редактировать (решение с использованием именованной структуры):

inline auto operator[] (int x)
{
class Col
{
T *col;
public:
Col(T *col) : col(col) {};
inline T operator[] (int y) { return col[y]; }
};
return Col(raster[x]);
}

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …