tgoop.com/cpplastic/378
Create:
Last Update:
Last Update:
Оцей підхід багатовимірної індексації з
Я вже колись робив operator ±
. А тепер зустрічайте мій
int main() {
Matrix m;
// ...
cout << m[100'500row, 13col]; // 🪄 magic
return 0;
}
який друкує:
Element at row 100500 and column 13 is 42
Працює, починаючи з C++11
Магії тут, звісно, небагато. Отже, індексація була тільки одновимірна, тобто параметр може бути тільки один, а значить звичайний
int
не підходить. Натомість робимо свій тип (я назвав Index2D
), що містить row
і column
. Тепер питання в тому, як два числа запакувати в цей тип, не викликаючи конструктор Index2D
явно. Для цього робимо конструктор, що приймає тільки одне число (row
), а також створюємо власний літерал, який його викликатиме. Далі для Index2D
перевантажуємо operator,
(так, ко́му можна перевизначити в C++), через який пхаємо друге число. Для симетрії також робимо власний літерал. І вуаля. Таким чином, якщо «розгорнути»m[100'500row, 13col]
то еквівалентом буде
m[Index2D{100'500}, 13];
або ж просто
m.operator[](operator""row(100'500).operator,(operator""col(13)))
За великого бажання можна навіть зробити типізацію цікавішою, щоб компілятор вам більше ніколи не дозволяв сплутати, що ж там перше йде,
row
чи column
, x
чи y
…Короч, ось мій приклад: https://ideone.com/zeZuQ0. Але взагалі писати такий код з перевантаженням коми краще не треба ))