|
Имитация многомерных массивов В любом варианте перегрузки оператор [] вызывается с одним аргументом произвольного типа. Например, компилятор лишь посмеется над следующей попыткой создания многомерного массива, потому что в ней оператор [] имеет несколько аргументов: 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.