LINUX.ORG.RU

это невозможно, не нарушая обратную совместимость -- ведь запятая внутри [] сейчас интерпретируется как оператор-запятая.

> А то сейчас многомерные коллекции без страшенных извращений не сделаешь.

да ладно, это не самое большое извращение С++

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

> ведь запятая внутри [] сейчас интерпретируется как оператор-запятая

Что-то моск не включился, можно подробнее разъяснить?

> это не самое большое извращение С++

Ну, в данный момент именон это извращение меня расстраивает. Доберусь до других -- буду на на них медитировать.

one_more_hokum ★★★
() автор топика
Ответ на: комментарий от one_more_hokum

> Что-то моск не включился, можно подробнее разъяснить?

$ 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 объединенные через оператор-запятую.

dilmah ★★★★★
()

> А то сейчас многомерные коллекции без страшенных извращений не сделаешь.

Переопределить operator () - страшенное извращение? :)

anonymous
()
Ответ на: комментарий от anonymous

Ну, если круглые скобки перегрузить -- на Ъ-массив это будет не похоже. Элджер предлагает в [] передавать анонимную структуру с произвольным количеством элементов, но это извращение почище перегрузки (), по моему.

one_more_hokum ★★★
() автор топика
Ответ на: комментарий от anonymous

Да, и ещё: объект с перегруженным operator () можно спутать с конструированием с параметрами, как мне думается. Т. е. читабельности кода это не способствует.

one_more_hokum ★★★
() автор топика
Ответ на: комментарий от one_more_hokum

> Элджер предлагает в [] передавать анонимную структуру с произвольным количеством элементов, но это извращение почище перегрузки (), по моему.

Это древний классический трюк. И не "анонимную структуру c произвольным количеством элементов", а прокси с своим перегруженным []. Который, в свою очередь может вернуть подобную ж херь.

anonymous
()
Ответ на: комментарий от one_more_hokum

не. Стандартный способ реализвать obj[i][j] -- это когда obj[i] возвращает объект некого вспомогательного класса, который обрабатывает последующий [j]

dilmah ★★★★★
()
Ответ на: комментарий от anonymous

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) создает анонимный экземпляр, который упаковывает
два измерения массива в один аргумент.

Вот, пример из Элджера. Перегрузки [] у вспомогательного объекта нет. Или мы про разные вещи говорим?

one_more_hokum ★★★
() автор топика
Ответ на: комментарий от dilmah

> obj[i] возвращает объект некого вспомогательного класса, который обрабатывает последующий [j]

Это что получается, для 50-мерной коллекции мне 49 вспомогательных классов реализовывать???

one_more_hokum ★★★
() автор топика
Ответ на: комментарий от one_more_hokum

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

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

Использование смещения в памяти по квадратным скобкам допустимо в реализации, но не в интерфейсе.

Dendy ★★★★★
()
Ответ на: комментарий от one_more_hokum

>Это что получается, для 50-мерной коллекции мне 49 вспомогательных классов реализовывать???

во-первых - нет, 49 объектов одного класса-композита. а во-вторых - что это за задача на 50-разрядную коллекцию? мой личный максимум - 11-мерный массив в навигационной подсистеме :)

jtootf ★★★★★
()
Ответ на: комментарий от one_more_hokum

Я когда то делал на шаблонах, в качестве одного из параметров была размерность, Array<N-1> Array<N>::operator[], как то так.

Legioner ★★★★★
()
Ответ на: комментарий от one_more_hokum

>объект с перегруженным operator () можно спутать с конструированием с параметрами

руки оторвать тому, кто вызывает конструктор явным кодом...

xydo ★★
()
Ответ на: комментарий от placement_new

Ну, во первых, я. А во вторых, то, что его не видно (за smartpointer-ами) не означает, что его нет. Угнетатель затаился! И ждёт момент, чтобы нанести удар в самое сердце ничего не подозревающему классу! Или в печень, тоже неплохо.

one_more_hokum ★★★
() автор топика
Ответ на: комментарий от z0D5e8n7x

>страх какой

авторство кода не моё, моя только оптимизация. массивов больших размерностей в промышленном коде пока не встречал

jtootf ★★★★★
()
Ответ на: комментарий от one_more_hokum

чего только люди не придумают, лишь бы фортран не учить

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.