> Что-то моск не включился, можно подробнее разъяснить?
$ cat test_bracket.c
int array[] = { 0, 1, 2 };
int main()
{
return array[1, 2];
}
$ gcc test_bracket.c
$ ./a.out
$ echo $?
2
как видно array[1,2] интерпретируется как array[2], потому что (1,2) это 1 и 2 объединенные через оператор-запятую.
Ну, если круглые скобки перегрузить -- на Ъ-массив это будет не похоже. Элджер предлагает в [] передавать анонимную структуру с произвольным количеством элементов, но это извращение почище перегрузки (), по моему.
Да, и ещё: объект с перегруженным operator () можно спутать с конструированием с параметрами, как мне думается. Т. е. читабельности кода это не способствует.
> Элджер предлагает в [] передавать анонимную структуру с произвольным количеством элементов, но это извращение почище перегрузки (), по моему.
Это древний классический трюк. И не "анонимную структуру c произвольным количеством элементов", а прокси с своим перегруженным []. Который, в свою очередь может вернуть подобную ж херь.
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(17,29) создает анонимный экземпляр, который упаковывает
два измерения массива в один аргумент.
Вот, пример из Элджера. Перегрузки [] у вспомогательного объекта нет. Или мы про разные вещи говорим?
Какая-то чепуха в треде. Да, многомерные массивы нужны, а вот ацессоры с помощью квадратных скобок - это несусветное заблуждение. Ощущение что вы пытаетесь применить первое попавшееся знание к задаче. Получается через одно место.
Дла работы с массивами любой мерности проектируется интерфейс с произвольным числом входящих параметров. Если количество параметров зашкаливает - их пакуют в промежуточные контейнеры с осмысленными именами, чтобы не было каши.
Использование смещения в памяти по квадратным скобкам допустимо в реализации, но не в интерфейсе.
>Это что получается, для 50-мерной коллекции мне 49 вспомогательных классов реализовывать???
во-первых - нет, 49 объектов одного класса-композита. а во-вторых - что это за задача на 50-разрядную коллекцию? мой личный максимум - 11-мерный массив в навигационной подсистеме :)
Ну, во первых, я. А во вторых, то, что его не видно (за smartpointer-ами) не означает, что его нет. Угнетатель затаился! И ждёт момент, чтобы нанести удар в самое сердце ничего не подозревающему классу! Или в печень, тоже неплохо.