Вообще вот очень родственная тема:
C++ [ ] оператор массива с несколькими аргументами?
Но мне в голову пришло вот такое решение:
Код: Выделить всё
struct TIndex {
size_t value;
TIndex() : value(0) {};
TIndex(size_t value) : value(value) {};
operator size_t () const { return value; };
operator size_t& () { return value; };
};
struct TSubscript_2D {
TIndex x;
TIndex y;
TSubscript_2D() : x(0), y(0) {};
TSubscript_2D(TIndex x, TIndex y) : x(x), y(y) {};
TSubscript_2D(TIndex x) : x(x), y(0) {};
};
TSubscript_2D&& operator, (const TIndex& x, const TIndex& y) {
return TSubscript_2D(x, y);
};
struct TMatrix_2D {
size_t width;
size_t height;
std::vector content;
TMatrix_2D(size_t width, size_t height) : width(width), height(height), content(width* height) {};
int& operator [](TSubscript_2D subscr) {
return content[(height * subscr.y) + subscr.x];
};
const int& operator [](TSubscript_2D subscr) const {
return content[(height * subscr.y) + subscr.x];
};
};
int main()
{
setlocale(LC_ALL, "");
TIndex x = 1, y = 2;
TMatrix_2D mmm (5, 5);
mmm[x, y] = 3; // content[5*2 + 1] = content[11] = 3
mmm[0, y] = 5; // content[5*2 + 0] = content[10] = 5
mmm[x, 1] = 7; // content[5*1 + 1] = content[6] = 7
std::vector vvv = { 5,4,3,2,1 };
vvv[x] = 5;
...
Конечно, всё это можно охватить шаблонами и макрассами, но вопрос в жизнеспособности самого принципа - создать отдельный класс для индексации.
Ну и еще, все это имеет значение для версий ниже C++23, конечно.
Подробнее здесь: https://stackoverflow.com/questions/782 ... -arguments
Мобильная версия