С++ - язык, который изучается постепенно.Оператор [] с нецелыми аргументами


Материалы книги получены с http://www.itlibitum.ru/

Имитация многомерных массивов

В любом варианте перегрузки оператор [] вызывается с одним аргументом произвольного типа. Например, компилятор лишь посмеется над следующей попыткой создания многомерного массива, потому что в ней оператор [] имеет несколько аргументов:

class WontWork {

public:

Foo& operator[](int x, int y); // Ха-ха-ха

};

Компиляторы обожают подобные ситуации - вроде бы все выглядит вполне логично, но как-то выпало из спецификации языка. Это дает им возможность поразмяться и вывалить все туманные сообщения об ошибках, которые они приберегли на черный день. Но когда сообщения перестанут сыпаться, наступает ваш черед смеяться, поскольку существует простой обходной путь.

struct Index {

int x;

int y;

Index(int ex, int why) : x(ex), y(why) {}

bool operator==(const Index& i) { return x == i.x && y == i.y; }

};

class WorksFine {

public:

Foo& operator[](Index i);

};

array[Index(17, 29)].MemberOfFoo(); // Работает

Index представляет собой структуру с тривиальным конструктором. Причина перегрузки оператора == станет ясна позже. Выражение Index(17,29) создает анонимный экземпляр, который упаковывает два измерения массива в один аргумент. Правда здорово? Получай, компилятор!


Назад    Содержание    Далее    

Copyright 2005. Климов Александр. All Right Reserved.
Сайт создан в системе uCoz