С++ || оператор [] с несколькими аргументами [дубликат]C++

Программы на C++. Форум разработчиков
Ответить
Гость
 С++ || оператор [] с несколькими аргументами [дубликат]

Сообщение Гость »

Подобные вопросы уже задавались несколько раз, но меня просили создать новую тему, а не заниматься некромантией))).
Вообще вот очень родственная тема:
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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»