Многомерная перегрузка []

Тема в разделе "LANGS.C", создана пользователем Antolflash, 22 ноя 2009.

  1. Antolflash

    Antolflash New Member

    Публикаций:
    0
    Регистрация:
    14 дек 2008
    Сообщения:
    167
    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
     
  2. reversecode

    reversecode Guest

    Публикаций:
    0
    даже не представляю как это сделать
    если даже после первого [] возращать ссылку
    а вторым [] разбирать ссылку
    то как быть с третьим ума не приложу
    наверное никак

    а как по мне так одинаково
     
  3. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Да, в это тогда что?
    Код (Text):
    1. class Array
    2. {
    3. public:
    4.         Array operator [] (int i)
    5.         {
    6.                 return Array();
    7.         }
    8. };
    9.  
    10. int main (int argc, char* argv[])
    11. {
    12.         Array ar;
    13.         Array ar2 = ar[0][0][0][0][0][0][0][0];
    14. }
     
  4. nop_

    nop_ New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2007
    Сообщения:
    61
    Получится. Например так: в операторе [] для массива нужно возвращать прокси объект, который хранит ссылку на сам массив, плюс индекс. В свою очередь у этого прокси должен быть свой operator [], который должен возвращать другой прокси объект (уже с двумя сохраненными индексами + ссылкой на сам массив). Второй прокси также должен иметь operator [] который доложен вызвать функцию-член массива, которая по трем индексам возвратит результат. Вменяемый оптимизатор должен свернуть это к вызову функции-члена.

    В общем случае реализация может варьироваться, плюс она зависит от того, как хранятся данные и как осуществляется доступ к ним. Можно ведь и так:

    Код (Text):
    1. template<class T, size_t i, size_t j, size_t k>
    2. struct array
    3. {
    4.   //...
    5.  
    6.   typedef T(&reference)[j][k];
    7.  
    8.   reference operator[](size_t i)
    9.     { return a[i]; }
    10.    
    11.   T a[i][j][k];
    12. };