http://otvety.google.ru/otvety/thread?table=%2Fotvety%2F%3Fhl%3Dru&tid=582c4adda7586e7c&hl=ru Можно ли перегружать оператор [], для n-мерных массивов? Как я понял, трёхмерный массив уже не получится. А двумерный читерский работает медленнее, чем перегрузка оператора (). http://www.parashift.com/c++-faq-lite/operator-overloading.html#faq-13.11
даже не представляю как это сделать если даже после первого [] возращать ссылку а вторым [] разбирать ссылку то как быть с третьим ума не приложу наверное никак а как по мне так одинаково
Да, в это тогда что? Код (Text): class Array { public: Array operator [] (int i) { return Array(); } }; int main (int argc, char* argv[]) { Array ar; Array ar2 = ar[0][0][0][0][0][0][0][0]; }
Получится. Например так: в операторе [] для массива нужно возвращать прокси объект, который хранит ссылку на сам массив, плюс индекс. В свою очередь у этого прокси должен быть свой operator [], который должен возвращать другой прокси объект (уже с двумя сохраненными индексами + ссылкой на сам массив). Второй прокси также должен иметь operator [] который доложен вызвать функцию-член массива, которая по трем индексам возвратит результат. Вменяемый оптимизатор должен свернуть это к вызову функции-члена. В общем случае реализация может варьироваться, плюс она зависит от того, как хранятся данные и как осуществляется доступ к ним. Можно ведь и так: Код (Text): template<class T, size_t i, size_t j, size_t k> struct array { //... typedef T(&reference)[j][k]; reference operator[](size_t i) { return a[i]; } T a[i][j][k]; };