Re[9]: Перегрузка == героин?
От: Павел Кузнецов  
Дата: 08.08.05 18:23
Оценка: 9 (2) +8 -1 :)
Quintanar,

> Скажите честно, зачем вам управлять памятью?


Управление памятью — составная часть управления временем жизни объектов. Первое в большинстве случаев само по себе имеет небольшое значение (хотя иногда тоже может стать важным), второе же важно значительно чаще, т.к. связано с разнообразными внешними по отношению к программе ресурсами: файлы, сокеты, различные handles операционной системы, соединения с базой данных и т.п. — короче, всевозможные ресурсы, которые нужно освобождать вовремя и вне зависимости от возникновения исключительных ситуаций. И в этом деле помощь языка в детерминированном разрушении очень помогает.
Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re: Перегрузка == героин?
От: adontz Грузия http://adontz.wordpress.com/
Дата: 06.08.05 18:53
Оценка: 29 (4) +4 -2
Здравствуйте, Курилка, Вы писали:

Вкратце:

Собака лает — караван идёт
Авторы подобной критики не улучшить что-то пытаются, а себя показать Вот мол какой я умный, а мировая общественность тупая.
Подобные теоретизирования совершенно бессмысленны. Успех языка решает рынок. Замечательные Лисп и Оберон пылятся на полке, а рулят Си++ и C#. Я могу привести 100 и 1 повод почему Си++ плохой язык, придумать какое-то проблемы, но ничем кроме сотрясания воздуха это не будет.

Подробнее:

>>In general, overloading means that a function name or an operator has two or more distinct meanings.

>>When you use it, the types of its operands are used by the language to determine which meaning should apply

Полная чушь! Суть как раз в том, что бы применять одно и тоже понятие к разным типам.

>>Overloading function names saves time during writing by saving keystrokes and, more significantly, saves the mental effort of thinking up unique names.


Мда, а автор похоже сам сидит на героине! Оказывается перегрузка операторов нужна, чтобы экономить 2 символа и писать + вместо add

>>The effect on readability is purely negative, however, because things with different meanings look the same.


Ещё раз убеждаемся, что автор понятия не имеет, зачем нужна перегрузка операторов.

Дальше даже читать не интересно. Видно, что автор не разбирается в вопросе
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[5]: Перегрузка == героин?
От: adontz Грузия http://adontz.wordpress.com/
Дата: 08.08.05 16:20
Оценка: 46 (5) +3 :)
Здравствуйте, Quintanar, Вы писали:

Q>Ну все, пошла обычная песня. Любители С++ уперлись в некую мнимую свободу С++ и в упор не видят, что есть и другие виды свободы. Например, свобода не думать об управлении памятью, свобода не думать, что означает данная закорючка в данном контексте, свобода не разбирать километровые объявления шаблонных типов и т.д.


Ага. Свобода не ходить на выборы, свобода когда только один сорт кофе, свобода не думать короче. Это не свобода. Это Богом данное право не напрягать свой мозг. К свободе оно отношения не имеет, оно имеет отношение к лени, экономии времени, низкой квалификации, но никак не к свободе.

Q>Что вам приходит в голову, ведомо только вам одному.


Нет. У меня есть образование. Например по формуле F = am я понимаю, что сила равная произведению ускорения на массу. Человек вроде вас боится, что за формулой F = am может скрываться, что мощность равная силе тока умноженной на напряжение, но увы любой кто не с Луны свалился и не ставит себе целью выпендриться такими обозначениями пользоваться не станет.

Вам мешает перегрузка? Не пользуйтесь! Но зачем хаять тех кто умеет пользоватся и делает это?

Давайте тогда хаять систему распределения памяти в Си++! Конечно! Какой-то дурак не знал что такое вектор, сделал new MyClass[38] и не сделал delete[]. Чем не повод? Система распределения памяти в Си++ полный отстой! Она не накладывает ограничений! Какие там ещё могут быть лозунги? А ну да! Все переходим на .Net!

Множественно наследование? О ужас! Заставлять человека писать или не писать virtual при наследовании. Какое напряжение мозга! Отменим multiple inheritance! В Хаскеле оно есть? Если нету, то я раз за этот язык — он полон ограничений усиливающих свободу не думать.

Короче хватит Думаешь, что ты умее тех кто, например, разрабатывает Си++? Си++ не сразу стал таким, какой он есть. 90% того что в нём реализовано добавили при утверждении очередного стандарта и не от нечего делать, а потому что в этом была необходимость. В Object Pascal'е который был с TurboPascal перегрузки операторов не было, в Delphi добавили. Думаешь зависть к Си++? Нет! Насущная необходимость!

Так что перегрузка операторов нужна.
Стоит ли её ограничивать? Нет, не стоит! Никакое формальное ограничение не выразит человеческую мысль. В результате будь такое ограничение введённым в современный промышленный язык им бы всё равно никто не стал пользоваться. Да, да, современный промышленный язык, на котором пишут сложные системы, а не богом забытый на котором пишут одни энтузиасты.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re: Перегрузка == героин?
От: opossum  
Дата: 08.08.05 10:46
Оценка: 44 (6) +3
Здравствуйте, Курилка, Вы писали:

К>Собственно хотелось бы обсудить вот эту статью — автор утверждает, что перегрузка (операторов/функций) увеличивает сложность программ и понижает их читаемость. Критикуются плюсы с их довольно обширными правилами приведения типов и пр.


Перегрузка — диспетчеризация по типу аргумента(-ов), выполняемая на
этапе компиляции.
Чтобы обсуждать/осуждать перегрузку полезно понимать суть
диспетчеризации вообще, и по типам в частности.

В приводимой статье вообще нет слова dispatch, а есть Heroin и drug,
что выдает ее явно популистско-провокационный характер.

Уже при построении системы числовых типов,
integer->rational->float->complex, обычно называемой numeric-tower,
из-за линейной иерархии, мы сталкиваемся с необходимостью приведения
типов, и введении обобщенных операторов, диспетчеризации по типу.

Отличное введение, которое бы не помешало прочесть автору статьи
содержится в уже упоминавшейся на rsdn книге :
SICP 'Structure and Interpretation of Computer Programs'
http://www.rsdn.ru/Forum/Message.aspx?mid=978416&only=1
Автор: Gaperton
Дата: 08.01.05

http://www.rsdn.ru/Forum/Message.aspx?mid=1298543&only=1
Автор: opossum
Дата: 29.07.05


в разделе
2.5 Systems with Generic Operations
http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-18.html#%_sec_2.5

Там приведено решение для динамической (в run-time) диспетчеризации по
типу, дан обзор _реальных_ проблем порождаемых арифметикой типов,
приведением и диспетчеризацией.

А если следовать логике автора — давайте заклеймим ветвление (if),
выбор (switch), и хеш таблицы — все же это можно использовать для
(о ужас!) диспетчеризации.

Итог: давайте спорить о приготовлении блюд, с тем кто умеет их
готовить.
Re[5]: Перегрузка == героин?
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 09.08.05 16:16
Оценка: +3 :))) :))
Здравствуйте, VladD2, Вы писали:

ГВ>>Как минимум, она позволяет писать обобщённые конструкции, [...]


VD>[...] А ведь казалось бы ЖЦ и делегаты решили бы все проблемы.


Ну, кто о чём...
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[9]: Перегрузка == героин?
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.08.05 22:07
Оценка: 1 (1) +6
Здравствуйте, Quintanar, Вы писали:

Q>Идеологически правильный вариант — выбрать другое обозначение для операции конкатенации. Ибо конкатенация по сути — это слияние списков, а не сложение.


Просто не нужно смотреть на строки как на списки. Строка — это объект. Для объектов этого класса логично воспринимать сложение как канкатинацию. Остальное от лукавого.

В общем, пусть любой кинет в меня камень если он способен не понять кострукцию "строка 1 " + "строка 2".
... << RSDN@Home 1.2.0 alpha rev. 591>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: Перегрузка == героин?
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.08.05 19:15
Оценка: 1 (1) +5
Здравствуйте, Quintanar, Вы писали:

Мужики, вы что? Столько умных слов чтобы обосновать неприемлемость знака "+" для конкатинации стро? Да каждый ребоенок поймет о чем решь и никогда в этом не запутается.

Кончайте подводить высшую математику туда где ее нет и где она на фиг не упала.
... << RSDN@Home 1.2.0 alpha rev. 591>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Перегрузка == героин?
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 08.08.05 07:35
Оценка: +1 :))) :))
Здравствуйте, eao197, Вы писали:

SK>>Напиши a.plus(b). Чем это хуже a + b никак понять не могу.


E>Тем, что ((a+b)/2 + c) лучше, чем a.plus(b).div(2).plus(c).


А от последней записи и до (+ (/ (+ a b) 2) c) недалеко
... << RSDN@Home 1.1.4 stable rev. 510>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[5]: Перегрузка == героин?
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.08.05 22:07
Оценка: +6
Здравствуйте, Quintanar, Вы писали:

Q>Не соглашусь. В данном конкретном случае есть некоторое удобство, однако в целом, это поощряет использование перегрузки для всего, что угодно, без всякой привязки к смыслу. Мне больше импонирует Haskell'овский подход. Там можно наложить ограничения на перегрузку для того, чтобы перегружаемые функции или операнды вели себя более предсказуемо.


Есть такая штука — практика. И она показывает, что никаких проблем перегрузка не вызывает. На практике никто не кидается перегружать все какие можно операторы для все попавшихся под руку типов. Те кто может навалять дурака просто недодумываются применить это средство.

Ну, и апеллировать к неразумности не разумно . Тут кто-то правильно заметил, что если человек идиот, то он и без перегрузки операторов способен наворотить многое. А разумный человек будет использовать перегрузку операторов там где это может дать большую выразительность.
... << RSDN@Home 1.2.0 alpha rev. 591>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Перегрузка == героин?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 11.08.05 06:17
Оценка: +6
Здравствуйте, Курилка, Вы писали:

К>Т.е. фактов, кроме сказанного adontz нет? Замечательно

К>Тут (чтот не могу найти) указали, что больное место перегрузки — ну ни разу не обязательно оно одно и тоже понятие! То, что оно выглядит как "+", допустим, не гарантирует то, что оно не будет жёсткий диск форматировать.

Странная логика. А что, из за того что можно сделать метод Add, который на самом деле удаляет из коллекции, нужно объявить методы героином? В чем, в этом отношении, разница между операторами и методами?
... << RSDN@Home 1.2.0 alpha rev. 599>>
AVK Blog
Re[5]: Перегрузка == героин?
От: Павел Кузнецов  
Дата: 08.08.05 16:03
Оценка: 1 (1) +4
Quintanar,

> Полную свободу предоставляет, кстати, не С++, а С — на нем можно реализовать все, что угодно, без нелепых ограничений С++.


Это шутка? Если нет, можно конкретный пример того, что реализуемо на C, но не реализуемо на C++? Т.к. обратные примеры можно привести легко (начиная со статического полиморфизма и возможности вычислений на этапе компиляции).
Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[3]: Перегрузка == героин?
От: Oyster Украина https://github.com/devoyster
Дата: 08.08.05 07:08
Оценка: +2 -2 :)
Здравствуйте, Трурль, Вы писали:

A>>Полная чушь! Суть как раз в том, что бы применять одно и тоже понятие к разным типам.


Т>
Т>1+2
Т>"Hello "+ "world"
Т>

Т>Здесь "+" одно и то же понятие?

Да. Понятие сложения. Для чисел результат — сумма, для строк — конкатенация. Но метафорический смысл един

Но вот, например, "<<" в C++ и оператор побитового сдвига, и оператор вывода в поток — вот тут уже явно разные понятия.
Re[5]: Перегрузка == героин?
От: Oyster Украина https://github.com/devoyster
Дата: 09.08.05 06:55
Оценка: +3 :))
Здравствуйте, StanislavK, Вы писали:

A>>Например если в шаблонный класс для подсчёта корней уравнения вместо double подставить какой-нибудь класс для вычислений с повышенной точностью вместо double, то код шаблонного класса не надо будет менять.

SK>Согласен, для чисел это полезно, но в общем, не нужная фича.

Согласен, для ходьбы ноги полезны, но в общем ненужная фича
Re[19]: No String Builder
От: adontz Грузия http://adontz.wordpress.com/
Дата: 09.08.05 08:34
Оценка: +1 -4
Здравствуйте, VladD2, Вы писали:

VD>Ну, и зачем что-то неявное через ухо когда можно просто взять класс заточенный под конкретную задачу?

VD>Я видил много С++-ного кода. И в болшинстве случаев никто даже не задумывался над тем, что конкатинация может быть тормозом.

Но она может. А так как думать всё равно никто не начнёт неявные оптимизации предпочтительнее.

VD>Я тебе уже третий раз повторяю, что в Шапре подобный код выливается в вызов функции string.Concat(). А эффективнее нее уже ничего не найти.


Влад, учи матчасть a.Concat(b.Concat(c.Concat(d))) это мягко говоря не самый эффективный код.

VD>Вдумки поскипаны.


Сдерживай свои негативные эммоции. Это не выдумки а описание реального кода. И если лично ты не понял идеи это не значит, что идея глупа.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[6]: Перегрузка == героин?
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.08.05 17:45
Оценка: :))) :))
Здравствуйте, Геннадий Васильев, Вы писали:

VD>>[...] А ведь казалось бы ЖЦ и делегаты решили бы все проблемы.


ГВ>Ну, кто о чём...


Да, да. А Влад опять о С++.
... << RSDN@Home 1.2.0 alpha rev. 591>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Перегрузка == героин?
От: jazzer Россия Skype: enerjazzer
Дата: 09.08.05 19:40
Оценка: 7 (1) +3
Здравствуйте, Курилка, Вы писали:

К>Собственно хотелось бы обсудить вот эту статью — автор утверждает, что перегрузка (операторов/функций) увеличивает сложность программ и понижает их читаемость. Критикуются плюсы с их довольно обширными правилами приведения типов и пр.


Мне понравился список литературы :)

А статья, на мой взгляд, абсолютно пустая и времени, на нее потраченного, не стоит
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[15]: Перегрузка == героин?
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 10.08.05 09:42
Оценка: 1 (1) +2 :)
Здравствуйте, VladD2, Вы писали:

VD>Ты путашь мякое с теплым. Ты продемонстрировал некотороую опасность автоматического приведения типов. И к оператору сложения строк это отношения не имеет. Так что твое подмигивание больше похоже на нервный тик.


Однако ж, проще верблюда протолкнуть сквозь игольное ушко, чем тебе доказать хоть что нибудь.
... << RSDN@Home 1.1.4 stable rev. 510>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[2]: Перегрузка == героин?
От: pvgoran Россия  
Дата: 12.08.05 14:39
Оценка: +1 :)))
Здравствуйте, jazzer, Вы писали:

J>А статья, на мой взгляд, абсолютно пустая и времени, на нее потраченного, не стоит


Зато какое обсуждение!
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[12]: Перегрузка == героин?
От: adontz Грузия http://adontz.wordpress.com/
Дата: 09.08.05 09:12
Оценка: 20 (3)
Здравствуйте, Курилка, Вы писали:

К>http://www.cookcomputing.com/blog/archives/000084.html

К>(цитата совпадает с твоей, но Флойдом там не пахнет)

Во-первых, http://www.cis.ksu.edu/~edwin/
Во-вторых, http://www.rsdn.ru/Forum/Message.aspx?mid=1279271&amp;only=1
Автор: adontz
Дата: 19.07.05

В-третьих, какая разница кто сказал?

Суть в том, что кусок фразы вырванный из контекста стал автортетным оправданием отсутсвия оптимизации.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[7]: Перегрузка == героин?
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 08.08.05 17:59
Оценка: 17 (2) :)
Здравствуйте, Quintanar, Вы писали:

Q>>>Ну все, пошла обычная песня. Любители С++ уперлись в некую мнимую свободу С++ и в упор не видят, что есть и другие виды свободы. Например, свобода не думать об управлении памятью, свобода не думать, что означает данная закорючка в данном контексте, свобода не разбирать километровые объявления шаблонных типов и т.д.


ГВ>>Слушай, давай уж обобщим до одного: "свобода не думать". Ну дык этаких "свободных разумов" хватает и без того. Прям девать некуда.

Q>Это С++ так на вас влияет?

Нет. Только текст постинга. Плюс несложное лексическое обобщение. Хотел не обидеть, но обратить внимание на закономерность, показавшуюся мне забавной.

Q> Ведь ясно же, что имелась в виду свобода не думать о мелочах, а заняться более серьезными делами.


Дело-то как раз в том, что на плюсовиков (по моим наблюдениям) перечисленные мелочи не так уж сильно и влияют, если речь идёт о серьёзных делах. И "километровые объявления шаблонных типов" — не проблема, а естественное следствие самих шаблонов (не хочешь — не пользуй). И управление памятью — не проблема, а полезная фича. А закорючки... у любого языка свои закорючки. Даже у LISP.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[3]: Перегрузка == героин?
От: vdimas Россия  
Дата: 09.08.05 12:35
Оценка: 9 (1) +2
Здравствуйте, Andrei N.Sobchuck, Вы писали:

A>>Мда, а автор похоже сам сидит на героине! Оказывается перегрузка операторов нужна, чтобы экономить 2 символа и писать + вместо add


ANS>Эта. А для чего еще она нужна?


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

Ведь есть возможность поступать проще — семантически одинаковые действия называть одинаковыми именами.

Можно попытаться составить краткий списочек ситуаций, где удобно использование перезагрузки:

1. Имеются различные способы идентификации объекта, тогда мы перегружаем сигнатуру ф-ий для всех этих способов идентификации.

Например, я храню именованные элементы в коллекции. Могу достучаться до элемента как по имени (обычно, если нужен некий конкретный), так и по индексу (удобно в различных алгоритмах). Использую перегрузку оператора [] и вполне счастлив.


2. Преобразование, извлечение данных.

Предположим, что нам надо извлекать одни и те же данные из разного их представления. Вполне естественно назвать ф-ию извлечения одних и тех же данных одинаково, но перегрузить ее для различных типов-операндов.


3. Выполнение действия.

Мы умеем выполнять семантически одинаковые действия над различными объектами. Например — регистрируем их (каждый по-своему), или складываем в одну коллекцию (каждый завернут в собственный адаптер, но внешний метод — все-равно один).

Зачем называть идни и те же намерения разными идентификаторами?


4. Контексты, опции, условия.

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

Как пример — форматирование по умлочанию, или с заданными форматами, локалями, профайдерами форматов и т.д. и т.п.
Еще пример — создание динамической коллекции. Можно перегрузить конструктор опцией предварительного размера, если заранее известно будущее количество элементов в нем (избежим многократного перераспределения памяти)



5. Опции по-умолчанию.

Продолжение предыдущего пунктаю

Иногда этих опций может быть очень много. Даже на С++, где значения аргументов по-умолчанию поддерживаются компиляторами, я стараюсь экономно использовать эту возможность в случае non-inline функций. Зачем мне закидывать в стек десяток ненужных аргументов, тем более, что этот код лежит на вызывающей стороне? Очень удобно использовать перегрузку и банально порождать меньший объем кода.

Жаль, что в современных языках, построенных на процедурном подходе, нет такого понятия как "точка входа" в процедуру (очень удобная фича при программировании на ACME ). Ее наличие позволило бы весьма эффективно релизовывать перегрузку почти во всех описанных случаях, но в случаях опций по-умолчанию — то вообще им тут место.


------------

Перегрузка ф-ий позволяет вырабатывать нечто вроде спецификаций на систему. Т.е. мы определяем, что такие-то действия над объектами, или такие-то методы объектов называются именно так-то. Ну а затем перегрузки содержат всевозможные вариации. Собственно, эти вариации нужны обычно для удобства пользования этими объектами.
Re[33]: No String Builder
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.08.05 19:15
Оценка: 5 (2) :)
Здравствуйте, Oyster, Вы писали:

O>Как видите, сначала идут 4 call к SomeFuncReturningString(), а потом только один call string.Concat. Выходит, вы неправы, уважаемый adontz?


Чтобы увидить настоящий код генерируемый джитом в оптимизированном (в релизе при запуске без отладчика) режиме нужно ползоваться cordbg.exe. Причем нужно задавать опцию "m JitOptimizations 1". Ди и то не факт, что код будет таким же как при обычном запуске. Вот как этовыглядит для данного примера:
C:\MyProjects\Tests\StrConcatCs\StrConcatCs\bin\Release>c:\VS\VS2005\SDK\v2.0\Bin\cordbg.exe StrConcatCs.exe
Microsoft (R) Common Language Runtime Test Debugger Shell Version 2.0.50215.44 (beta2.050215-4400)
Copyright (C) Microsoft Corporation. All rights reserved.

(cordbg) run StrConcatCs.exe
Process 8488/0x2128 created.
Warning: couldn't load symbols for C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll
[thread 0x2408] Thread created.

025:            A.Test();
(cordbg) m JitOptimizations 1
JIT's will produce optimized code


(cordbg) si

014:            _e = SomeFuncReturningString()
(cordbg) sh
009:            return "qwerty";
010:    }
011:
012:    public static void Test()
013:    {
014:*           _e = SomeFuncReturningString()
015:                    + SomeFuncReturningString()
016:                    + SomeFuncReturningString()
017:                    + SomeFuncReturningString();
018:    }
019: }
(cordbg) dis 25
 [0000] push        edi
 [0001] push        esi
 [0002] push        ebx
 [0003] push        ebp
 [0004] cmp         dword ptr ds:[001A278Ch],0
 [000b] je          00000007
 [000d] call        7674500C
*[0012] call        dword ptr ds:[03180D80h]
 [0018] mov         ebp,eax
 [001a] call        dword ptr ds:[03180D80h]
 [0020] mov         ebx,eax
 [0022] call        dword ptr ds:[03180D80h]
 [0028] mov         esi,eax
 [002a] call        dword ptr ds:[03180D80h]
 [0030] mov         edi,eax
 [0032] push        esi
 [0033] push        edi
 [0034] mov         edx,ebx
 [0036] mov         ecx,ebp
 [0038] call        dword ptr ds:[031670A4h]
 [003e] mov         esi,eax
 [0040] lea         edx,ds:[01B41F34h]
 [0046] call        7651C908
 [004b] nop
 [004c] pop         ebp
 [004d] pop         ebx
 [004e] pop         esi
 [004f] pop         edi
 [0050] ret
(cordbg) ex
Terminating current process...
Process exited.
... << RSDN@Home 1.2.0 alpha rev. 591>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Перегрузка == героин?
От: adontz Грузия http://adontz.wordpress.com/
Дата: 08.08.05 17:50
Оценка: 1 (1) +1 -1
Здравствуйте, Quintanar, Вы писали:

Q>Бла-бла-бла. Один кофе только у любителей С++. Другие выбирают между разными языками и смотрят как реализованы идеи там.


Я активно пишу на Си++, C#, PHP и даже недавно на Паскале опять пришлось. Уж в чём в чём, а в том что я не знаю других языков обвинить меня точно нельзя. У Си++ есть недостатки, но перегрузка операторов не входит в их число.

A>>Нет. У меня есть образование. Например по формуле F = am я понимаю, что сила равная произведению ускорения на массу.

Q>Да ну. Как раз наоборот, вы застряли на уровне ньютоновской механики

Я говорил о том, что F это обозначение силы, а m массы и для того чтобы читать чужие формулы не нужно осбо договариваться, нужно просто пользоваться общепринятыми обозначениями. Точно так же мне не придёт в голову для сложения двух чисел использовать %.

Q>Да не отстой, поскольку ее фактически нет и каждый вправе сделать свою.


А в праве не делать. Не хочется? Не делай! Если мне понадобится GC я всегда смогу его организовать и для Си++ или воспользоватся готовой реализацией(и кстати та что в .Net мягко говоря не лучшая). Зато мне никто GC не навязывает.

Q>Вопреки сложившемуся мнению, программы можно писать вообще без ООП, хотя это, конечно, требует несколько большего интеллекта.


Угу. На ассемблере. И перегрузки операторов там нету

Q>Странно слышать это от сторонника языка, где нельзя даже создать новый оператор.


Зачем мне новый? В Си++ 10 унарных и 32 бинарных оператора которые можно перегрузить не считая () который может принимать любое количество аргументов. Я думаю, что из 43-х значков вполне можно выбрать тот, который по душе. А на большее просто ASCII символов не хватит.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[11]: Перегрузка == героин?
От: Шахтер Интернет  
Дата: 09.08.05 23:45
Оценка: 1 (1) +2
Здравствуйте, Quintanar, Вы писали:

Q>Здравствуйте, Геннадий Васильев, Вы писали:


ГВ>>Мне не мешает управление памятью. Наоборот — красивое решение содержит в себе элегантное управление памятью (вернее — жизненным циклом объектов, а не памятью как таковой) как неотъемлемую часть. И не надо сравнивать с математикой — любая формула из ВМ включает в себя элементарные операции сложения/умножения.


Q>Если бы каждый элегантно разрабатывал бы болты под себя, а не пользовался набором стандартных, то цивилизации не существовало бы.


Наоборот, все мы сейчас обсуждали бы превосходства стандартного хвоста вися на дереве.

Q>Конструктор может позволить себе не заниматься такими мелочами, а сконцентрироваться на машине в целом.


Неверно. Нет такой вещи -- машина в целом. Это только на картинке у художника так бывает. В инженерии целое есть сумма составных частей и качество этого целого определяется качеством каждого элемента, даже самого маленького.
Впрочем, у хорошего художника значение имеет даже маленькое колечко...
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re[2]: Перегрузка == героин?
От: Трурль  
Дата: 08.08.05 05:01
Оценка: +3
Здравствуйте, adontz, Вы писали:

A>Полная чушь! Суть как раз в том, что бы применять одно и тоже понятие к разным типам.


1+2
"Hello "+ "world"

Здесь "+" одно и то же понятие?
Re[6]: Перегрузка == героин?
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 08.08.05 08:21
Оценка: +2 -1
Здравствуйте, Oyster, Вы писали:

O>PS: За что минус: Re[3]: Перегрузка == героин?
Автор: Oyster
Дата: 08.08.05
?


Я согласен с тем
Автор: Трурль
Дата: 08.08.05
, что конкатенация и сложение это разные вещи, и, соответсвенно, не согласен с тем, что это по сути одно и то же. Взять хотябы коммутативность.
... << RSDN@Home 1.1.4 stable rev. 510>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[8]: Перегрузка == героин?
От: ansi  
Дата: 09.08.05 13:00
Оценка: 9 (1) +1
Здравствуйте, Кодёнок, Вы писали:

A>>Побитовое И?

Кё>Просто "И". Это у тебя привычка так о нем думать, потому что для целых оно побитовое.
А у тебя привычка так думать о +, потому что для целых оно означает сложение.


A>>В ПХП, например, — это точка. Но точка там, насколько я помню, не используется для доступа к членам класса, поэтому вполне допустима с этой точки зрения. В Си++ я не вижу символа более подходящего, чем +.

Кё>Это для строки. А для последовательности или матрицы появляется упомянутый Трурлем конфликт.

Сложение векторов и матриц — это вполне стандартная операция именно поэлементного сложения. И она законно обозначается символом +. Никаких конфликтов я не вижу.

Дело в том, что большинство языков моделируются именно под математику. Вот мы тут оперируем такими понятиями как массив, множество, последовательность, вектор, матрица, строка (string). На мой взгляд, картина следующая:

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

  2. Множество. Набор элементов, необязательно однотипных.
    Для множества существуют следующие основные математические операции:
    • Объединение. Математический знак не выражается в ASCII (похож на заглавную U). Наиболее уместным по смыслу считаю |.
    • Пересечение. Математический знак не выражается в ASCII (похож на перевернутую заглавную U). Наиболее уместным по смыслу считаю &.
    • Разность. Математический знак: \.
    • В случае, когда элементами являются числами, либо другие однотипные объекты к которым применимы следующие операции: поэлементное сложение, разность, произведение, частное (множество всех возможных сумм, разностей, произведений, частных элементов). Математический знак: +, -, / :, · (для удобства заменяется *).
    • Декартово произведение — не выражается в ASCII (похоже на латинскую x). Варианты приветсвуются.

  3. Вектор. Упорядоченный набор координат (по-моему, допустимы только числа) в n-мерном пространстве (либо в бесконечномерном).
    Для вектора существуют следующие основные математические операции:
    • Сумма (покомпонентное сложение). Математический знак: +.
    • Разность (покомпонентная разность, если не ошибаюсь). Математический знак: -.
    • Скалярное произведение. Математический знак: ·, "пустой символ", а так же скобки. Пока используется только первый, но для удобства заменяется *.
    • Векторное произведение. Математический знак: не выражается в ASCII (похоже на латинскую x). Варианты опять же приветсвуются.

  4. Матрица. Примерное определение сочинить не в силах почему-то . Ну, скажем табличка из чисел .
    Для матрицы существуют следующие основные математические операции:
    • Сумма (покомпонентное сложение). Математический знак: +.
    • Разность (покомпонентная разность). Математический знак: -.
    • Произведение. Математический знак: не выражается в ASCII (похоже на латинскую x). Заменяется на *.
    Такие операции, как транспонирование, обращение и пр. приходится выражать функциями (т.е. символьными именами).

  5. Последовательность. Упорядоченный набор однотипных объектов.
    Для последовательности существуют следующие основные математические операции:
    • Сумма (покомпонентное сложение). Математический знак: +.
    • Разность (покомпонентная разность). Математический знак: -.
    • Произведение. Математический знак: · (для удобства заменяется *).

  6. Строка. Упорядоченный набор символов. Нет аналога в математике.
    Для строки не существует математических операций (потому как арифметические операции над символами не имеют смысла). Но существует "родная" операция:
    • Конкатенация (слияние). Знак: +. Не коммутативно.

    Такие операции, как возведение в верхний/нижний регистр, индекс вхождения подстроки и пр. приходится выражать символьными именами.

Почти все эти объекты — просто иное толкование массива, или списка (ну или двумерных в случае матрицы). Т.е. физически — это все одно и то же, но семантически — это разные вещи. Вопрос в том, что нужно вам?
Это стандартные обозначения, которые думаю знает каждый. Если надо нечто такое, что не попадает ни под один из этих объектов, то вся ответственность по выбору символов операций и их семантике полностью на вашей совести.

Кё>Вообще давайте отличать значение символа от своих привычек Амперсанд, обозначает союз "и" (et), который почти всегда (кроме битовых и логических операций, которые суть одно и то же) обозначает соединение оригинальных объектов вместо, а вот за плюсом стоит создание нового объекта.


Каждая операция порождает новый объект. Вопрос лишь в том КАКИМ ОБРАЗОМ.

Кё>Возможность вводить новые типы (ПОЛНОПРАВНЫЕ с встроенными) тоже увеличивает выразительность, и перегрузка операций просто обязана сопутствовать этой возможности. Иначе они не будут полноправными Автор стати выдумал какие-то мифические проблемы.


Согласен. Пошел спать
new RSDN@Home(1.1.4, 303) << new Message(); std::head::ear << "Metallica — Fade To Black";
Re[3]: Перегрузка == героин?
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.08.05 08:12
Оценка: 5 (1) -1
Здравствуйте, Трурль, Вы писали:

Т>
Т>1+2
Т>"Hello "+ "world"
Т>

Т>Здесь "+" одно и то же понятие?

Для человека — да. Вот если "Hello " + "world" будет заниматься побайтным сложением строк, или еще какую фигню делать, то это уже будет уродство.

Согласись, что такой код:
string mather = "мама";
string result = "Папа" + ' ' + mather + " я";

Читается кда лучше чем:
string mather = "мама";
string result = StrCat(StrCat(StrCat("Папа", ToString(' ')), mather), " я");

... << RSDN@Home 1.2.0 alpha rev. 591>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Перегрузка == героин?
От: cranky Украина  
Дата: 08.08.05 08:29
Оценка: 1 (1) +1
Здравствуйте, Oyster, Вы писали:

O>Здравствуйте, Трурль, Вы писали:


A>>>Полная чушь! Суть как раз в том, что бы применять одно и тоже понятие к разным типам.


Т>>
Т>>1+2
Т>>"Hello "+ "world"
Т>>

Т>>Здесь "+" одно и то же понятие?

O>Да. Понятие сложения. Для чисел результат — сумма, для строк — конкатенация. Но метафорический смысл един

Ну да.
("Hello world"-"world") ? "Hello "
Или иначе: как отнимать строки, если сложение (в виде конкатенации) возможно?
В случае соединения строк мне больше нравится введение нового оператора в язык, например, тильда в D.

O>Но вот, например, "<<" в C++ и оператор побитового сдвига, и оператор вывода в поток — вот тут уже явно разные понятия.

С++ вообще проектировался по принципу минимальных нововведений в синтаксис языка, отсюда и операторы в/в потоков, и обозначение ЧВФ, и некоторые другие вещи.
You aren't expected to absorb this
Re[2]: Перегрузка == героин?
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 07.08.05 12:01
Оценка: :))
Здравствуйте, adontz, Вы писали:
>>>Overloading function names saves time during writing by saving keystrokes and, more significantly, saves the mental effort of thinking up unique names.

A>Мда, а автор похоже сам сидит на героине! Оказывается перегрузка операторов нужна, чтобы экономить 2 символа и писать + вместо add


Эта. А для чего еще она нужна?
... << RSDN@Home 1.1.4 stable rev. 510>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[6]: Перегрузка == героин?
От: StanislavK Великобритания  
Дата: 08.08.05 07:27
Оценка: -2
Здравствуйте, eao197, Вы писали:

E>Здравствуйте, StanislavK, Вы писали:


A>>>>>Мда, а автор похоже сам сидит на героине! Оказывается перегрузка операторов нужна, чтобы экономить 2 символа и писать + вместо add


SK>>>>Просвети, кстати, зачем, если не для этого?


O>>>Для лучшего отражения той или иной метафоры в коде. Например, два комплексных числа логичней складывать как a + b, а не a.Add(b).


SK>>Напиши a.plus(b). Чем это хуже a + b никак понять не могу.


E>Тем, что ((a+b)/2 + c) лучше, чем a.plus(b).div(2).plus(c).


Для чисел — да, полность согласен и то это дело вкуса, метафоры тут не при чем.
Но все остальное более логично выглядит как раз с функциями, а не с операторами.
Re[2]: Перегрузка == героин?
От: Quintanar Россия  
Дата: 08.08.05 14:34
Оценка: +1 -1
Здравствуйте, adontz, Вы писали:

A>Полная чушь! Суть как раз в том, что бы применять одно и тоже понятие к разным типам.


>>>Overloading function names saves time during writing by saving keystrokes and, more significantly, saves the mental effort of thinking up unique names.


A>Ещё раз убеждаемся, что автор понятия не имеет, зачем нужна перегрузка операторов.


A>Дальше даже читать не интересно. Видно, что автор не разбирается в вопросе


Не стоит брызгать слюной, поскольку критика справедлива. С++ вариант перегрузки не накладывает никаких ограничений _вообще_. Т.е. перегруженный оператор может делать, буквально, что угодно, и о никакой "общности понятий" речь идти не может. Но есть и другие подходы к перегрузке, которые реализованы, например, в языке Haskell. Там мы не сможем нарушить некоторые аксиомы связанные с перегружаемой функцией или операцией и поэтому + всегда будет вести себя как + — т.е. мы не сможем перегрузить его для каких-то противоестественных целей.
Re[4]: Перегрузка == героин?
От: Quintanar Россия  
Дата: 08.08.05 15:56
Оценка: +2
Здравствуйте, adontz, Вы писали:

A>А Си++ вообще довольно много свободы даёт и требует мозгов чтобы этой свободой надлежащим образом распорядится. Например та же адресная арифметика. Кому эта свобода бьёт в голову, те на Си++ не пишите. Кто же заставляет?

A>Почему-то мне не приходит в голову сопоставлять перегруженным операторам неочевидные понятия. Кому приходит, то и виноват!
A>Тут есть два выхода: не писать на C# или научится правильно пользоваться перегрузкой. Кого на что хватает тот такой путь и выбирает

Ну все, пошла обычная песня. Любители С++ уперлись в некую мнимую свободу С++ и в упор не видят, что есть и другие виды свободы. Например, свобода не думать об управлении памятью, свобода не думать, что означает данная закорючка в данном контексте, свобода не разбирать километровые объявления шаблонных типов и т.д. Полную свободу предоставляет, кстати, не С++, а С — на нем можно реализовать все, что угодно, без нелепых ограничений С++.
Что вам приходит в голову, ведомо только вам одному. То, что вы считаете логичным и понятным, может оказаться совершенно нелогичным и непонятным для других.
Re[8]: Перегрузка == героин?
От: Quintanar Россия  
Дата: 08.08.05 15:58
Оценка: +2
Здравствуйте, Nose, Вы писали:

N>
N>    strcat( string("Error ") , strcat( to_string(errNum) , strcat( string(" while proc...."), to_string( objNum ) ) ) );
N>


N>вместо 3-х знаков "+"... не страшно?

N>Идеологически правильный вариант грозит нечитаемым кодом...

Идеологически правильный вариант — выбрать другое обозначение для операции конкатенации. Ибо конкатенация по сути — это слияние списков, а не сложение.
Re[6]: Перегрузка == героин?
От: Quintanar Россия  
Дата: 08.08.05 16:55
Оценка: +2
Здравствуйте, adontz, Вы писали:

A>Ага. Свобода не ходить на выборы, свобода когда только один сорт кофе, свобода не думать короче. Это не свобода. Это Богом данное право не напрягать свой мозг. К свободе оно отношения не имеет, оно имеет отношение к лени, экономии времени, низкой квалификации, но никак не к свободе.


Бла-бла-бла. Один кофе только у любителей С++. Другие выбирают между разными языками и смотрят как реализованы идеи там.

A>Нет. У меня есть образование. Например по формуле F = am я понимаю, что сила равная произведению ускорения на массу. Человек вроде вас боится, что за формулой F = am может скрываться, что мощность равная силе тока умноженной на напряжение, но увы любой кто не с Луны свалился и не ставит себе целью выпендриться такими обозначениями пользоваться не станет.


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

A>Вам мешает перегрузка? Не пользуйтесь! Но зачем хаять тех кто умеет пользоватся и делает это?

A>Давайте тогда хаять систему распределения памяти в Си++! Конечно! Какой-то дурак не знал что такое вектор, сделал new MyClass[38] и не сделал delete[]. Чем не повод? Система распределения памяти в Си++ полный отстой! Она не накладывает ограничений! Какие там ещё могут быть лозунги? А ну да! Все переходим на .Net!

Да не отстой, поскольку ее фактически нет и каждый вправе сделать свою, но и смысла для 98% задач в ней мало. Для любой программы, где производительность не стоит на не просто 1-м, а 1-м в квадрате месте, GC будет справляться неплохо.

A>Множественно наследование? О ужас! Заставлять человека писать или не писать virtual при наследовании. Какое напряжение мозга! Отменим multiple inheritance! В Хаскеле оно есть? Если нету, то я раз за этот язык — он полон ограничений усиливающих свободу не думать.


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

A>Короче хватит Думаешь, что ты умее тех кто, например, разрабатывает Си++? Си++ не сразу стал таким, какой он есть. 90% того что в нём реализовано добавили при утверждении очередного стандарта и не от нечего делать, а потому что в этом была необходимость. В Object Pascal'е который был с TurboPascal перегрузки операторов не было, в Delphi добавили. Думаешь зависть к Си++? Нет! Насущная необходимость!


Object Pascal намного хуже С++, о нем речи вообще быть не может.

A>Так что перегрузка операторов нужна.

A>Стоит ли её ограничивать? Нет, не стоит! Никакое формальное ограничение не выразит человеческую мысль. В результате будь такое ограничение введённым в современный промышленный язык им бы всё равно никто не стал пользоваться. Да, да, современный промышленный язык, на котором пишут сложные системы, а не богом забытый на котором пишут одни энтузиасты.

Странно слышать это от сторонника языка, где нельзя даже создать новый оператор. С++ учиться и учиться гибкости у того же Lisp'a.
Re[8]: Перегрузка == героин?
От: Quintanar Россия  
Дата: 08.08.05 18:09
Оценка: +2
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Дело-то как раз в том, что на плюсовиков (по моим наблюдениям) перечисленные мелочи не так уж сильно и влияют, если речь идёт о серьёзных делах. И "километровые объявления шаблонных типов" — не проблема, а естественное следствие самих шаблонов (не хочешь — не пользуй). И управление памятью — не проблема, а полезная фича. А закорючки... у любого языка свои закорючки. Даже у LISP.


Скажите честно, зачем вам управлять памятью? Вы пишете real time систему или игру, на худой конец? Ведь математик не изобретает каждый раз все с нуля, а использует имеющийся базис, чтобы идти вперед и не иметь дела с посторонними в общем-то вещами. И так везде. Если сильно надо, можно откатиться назад и пересмотреть основы — написать свой GC, свою систему классов и т.п. Но как правило, это не нужно.
Re[4]: Перегрузка == героин?
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.08.05 22:07
Оценка: :))
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Как минимум, она позволяет писать обобщённые конструкции, которые оперируют семантикой перекрываемых операторов. Нпаример, в STL часто пользуются перекрытием operator() для подмены функции функтором. Другой пример, перекрытие operator->() для smart-указателей.


Отличные примеры!... того как проблемы языка вынуждают делать совершенно казалось бы бесполезные вещи. А ведь казалось бы ЖЦ и делегаты решили бы все проблемы.
... << RSDN@Home 1.2.0 alpha rev. 591>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[11]: Перегрузка == героин?
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.08.05 22:07
Оценка: +2
Здравствуйте, Quintanar, Вы писали:

Q>Это не совсем идеалистический вариант, кое-где так и сделано. Кроме того, никто не говорит о том, что обязательно нужно представлять строку списком, речь идет о том, что конкатенация по сути — это слияние списков, а не арифметическре сложение, и логично для этого использовать другое обозначение.


А в чем, в конце концов, проблема если для конкатинации массивов (списков и т.п.) будет тоже применяться "+"? Не уж то кто-то не поймет суть происходящего?

Я тебе по сикрету скажу, что некоторые товарищи для помещения значений в потоки операторы побитовых сдвигов испоьзуют. И что характерно еще никто их с побитовым сдвигом не перепутал. А ты говоришь "+" — это плохо.
... << RSDN@Home 1.2.0 alpha rev. 591>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[22]: No String Builder
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.08.05 11:00
Оценка: +1 -1
Здравствуйте, adontz, Вы писали:

O>>??? Оно преобразуется в System.String.Concat(a, b, c, d) , так что непонятно, о чём вы.


A>Да ну?


Ну, да. Причем я точно помню, что где-то год назад тебле уже об этом говорил. Но ты даже усом не повел.

A>Я между прочим не наобум сказал, а сгенерированный код поглядел


Врешь.
... << RSDN@Home 1.2.0 alpha rev. 591>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Перегрузка == героин?
От: Quintanar Россия  
Дата: 09.08.05 14:47
Оценка: +2
Здравствуйте, VladD2, Вы писали:

VD>Есть такая штука — практика. И она показывает, что никаких проблем перегрузка не вызывает. На практике никто не кидается перегружать все какие можно операторы для все попавшихся под руку типов. Те кто может навалять дурака просто недодумываются применить это средство.


Никаких доказательств этим утверждениям нет, поэтому стоит убрать из рассмотрения.
Re[11]: Перегрузка == героин?
От: adontz Грузия http://adontz.wordpress.com/
Дата: 09.08.05 14:54
Оценка: +2
Здравствуйте, Quintanar, Вы писали:

A>>Ну так это проблема "обезьяны с гранатой". Если ты не доверяешь человеку настолько, чтобы подпускать его к Си++ — не подпускай. си++ язык требующий высокого профессионального уровня. Именно требующий. Это не VB и "среднестатистический ламерок не разобрался" неуместный упрёк. Си++ и не расчитан на то, чтобы в нём кто попало разбирался. Язык мощный но вместе с тем и сложный.


Q>Это вы намекаете, что С++ существует только для "посвященных" в тайные знания программистов, элиты мирого кодирования. Если так, что же на нем пишут все кому не лень?


Собственно а кто сказал, что на нём все кому не лень пишут? На Си++ пишет не так уж много людей. Вот на "Си с классами" огромное количество.

A>>Это общепринятое обозначение. Оно применяется не только для std::string но и для многих других строк и не только в Си++. То что + применяется для конкатекации это даже если и недостаток, то уж точно не Си++'овый.

Q>Бредовое обозначение, и то, что оно почему-то употребляется в С++, меня не волнует.

Ну да. появилось обозначение не в Си++, язык его только перенял, но виноват Си++. Главное точно известны виноватые.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[28]: No String Builder
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.08.05 19:15
Оценка: -2
Здравствуйте, adontz, Вы писали:

A>А чем ты IL смотришь? Просто лично я гляжу ассемблерный код EXE'шника.


Ассемблрный код дотнетного exe-шнкика?
... << RSDN@Home 1.2.0 alpha rev. 591>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Перегрузка == героин?
От: adontz Грузия http://adontz.wordpress.com/
Дата: 10.08.05 11:54
Оценка: +2
Здравствуйте, Курилка, Вы писали:

К>Т.е. фактов, кроме сказанного adontz нет? Замечательно


Факт есть очень простой. Перегруженный оператор влияет не на конкретный класс, а на систему в целом. О того, что где-то перегрузили оператор в совсем другом месте может изменится поведения. Поэтому подходить к перегрузке надо ответсвенно. Это мощный, но вместе с тем сложный инструмент.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[16]: Перегрузка == героин?
От: _vovin http://www.pragmatic-architect.com
Дата: 10.08.05 13:04
Оценка: +1 -1
Здравствуйте, Курилка, Вы писали:

К>Здравствуйте, VladD2, Вы писали:


VD>>Здравствуйте, Andrei N.Sobchuck, Вы писали:


ANS>>>Демонстрация потенциального источника ошибок. Как и C с адресной арифметикой. Этот аргумент тебе знаком?


VD>>Ты путашь мякое с теплым. Ты продемонстрировал некотороую опасность автоматического приведения типов. И к оператору сложения строк это отношения не имеет. Так что твое подмигивание больше похоже на нервный тик.


К>Возвращаясь к исходной статье, хоть она и не очень корректна, но доля правды там есть. Так вот, там говорится, что перегрузка как раз неявными автоматическими приведениями типов и опасна, т.е. такими ситуациями, когда программист затрудняется сказать, какая именно реализация оператора/функции из энного числа имеющихся будет использована. Как раз это и показал тебе Андрей


Неявные преобразования типов относятся к характеристикам языков со слабой типизацией (weakly typed languages). Но, в реальности, ни один практичный язык не может быть на 100% сильно типизированным, поэтому такие маленькие отступления допустимы. Язык становится слаботипизированным, когда отклонения от правил типизации имеют глобальный характер, как в случае с указателями для C.
Но такие вещи, как волшебный оператор сложения строк и автоматическое преобразование типов, не добавляет красоты и стройности языку. Намного лучше, когда все подчиняется одному своду правил. Например, есть коллекции с оператором конкатенации (, & ++ — что угодно уникальное), а строка, как частный случай коллекции наследует этот оператор.
Re[9]: Перегрузка == героин?
От: Павел Кузнецов  
Дата: 08.08.05 18:56
Оценка: 30 (1)
Quintanar,

> Ну а банальный foreach реализовать нельзя. Или таки можно в виде огромной груды шаблонов?


Таки можно http://boost-sandbox.sourceforge.net/libs/foreach/doc/html/
Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[11]: Перегрузка == героин?
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 13.08.05 11:17
Оценка: 14 (1)
Здравствуйте, Andir, Вы писали:

E>>
E>>// Вычисляем MD5-хеш двоичного образа.
E>>Md5_Hash hash;
E>>hash << my_data;
E>>


A>А насчёт MD5 это просто по принципу или существует где-нибудь такая реализация криптографических примитивов?


Просто по принципу, сам я таких готовых вещей для MD5 не видел.
Хотя, вот например, такая цитата из tutorial по библиотеке Botan:

First, some notation. The passphrase is stored as a std::string named passphrase. The input and
output files (infile and outfile) are of types std::ifstream and std::ofstream (respectively).

3.1.1 First try

We hash the passphrase with SHA-1, and use the resulting hash to key Blowfish. To generate the IV, we
prepend a single ’0’ character to the passphrase, hash it, and truncate it to 8 bytes (which is Blowfish’s block
size).

HashFunction* hash = get_hash("SHA-1");

SymmetricKey key = hash->process(passphrase);
SecureVector<byte> raw_iv = hash->process(’0’ + passphrase);
InitializationVector iv(raw_iv, 8);

Pipe pipe(get_cipher("Blowfish/CBC/PKCS7", key, iv, ENCRYPTION));

pipe.start_msg();
infile >> pipe;
pipe.end_msg();
outfile << pipe;


Сам я с Botan не работал (просто раньше столкнулся с Crypto++ и переходить на что-то другое уже смысла не было), может там еще чего похожее есть. Или же можно сделать:
class My_Data { ... };

Botan::Pipe &
operator<<( Botan::Pipe & pipe, const My_Data & d )
    {
        ...
        return pipe;
    }
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[15]: Перегрузка == героин?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 09.08.05 16:04
Оценка: 12 (1)
Здравствуйте, Andrei N.Sobchuck, Вы писали:

ANS>Кстати, вопрос к знатокам .Net. В Java (вроде начиная с 1.5) можно стринг билдер сделать взаимозаменяемым с потоком вывода (они поддерживают интерфейс Appendable). А как с этим дело в C#?


А в C# есть StringWriter
... << RSDN@Home 1.2.0 alpha rev. 599>>
AVK Blog
Re[11]: Перегрузка == героин?
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.08.05 11:27
Оценка: 10 (1)
Здравствуйте, ansi, Вы писали:

A>Здравствуйте, Трурль, Вы писали:



Т>>В математике есть строки, а операция конкатенации обычно не обозначется (реже обозначется ||).


A>Дядя Страуструп еще пока не научил Си++ перегружать операцию "" и пробел... А обозначение || для конкатенации еще хуже, чем +.


Тут рулит Scala
Автор(ы): Martin Odersky, Philippe Altherr, Vincent Cremet, Burak Emir, Sebastian Maneth, Stephane Micheloud, Nikolay Mihaylov, Michel Schinz, Erik Stenman, Matthias Zenger, http://scala.epfl.ch
Дата: 22.05.2005
Язык Scala был создан в 2001-2004 гг в лаборатории методов программирования EPFL. Он стал результатом исследований, направленных на разработку более хорошей языковой поддержки компонентного ПО. С помощью Scala мы хотели бы проверить две гипотезы. Во-первых, мы считаем, что язык программирования компонентного ПО должен быть масштабируемым в том смысле, что должна быть возможность с помощью одних и тех же концепций описать как маленькие, так и большие части. Поэтому мы сконцентрировались на механизмах абстракции, композиции и декомпозиции вместо введения большого количества примитивов, которые могут быть полезными только на каком-то одном уровне масштабирования. Во-вторых, мы считаем, что масштабируемая поддержка компонентов может быть предоставлена языком программирования, унифицирующим и обобщающим объектно-ориентированное и функциональное программирование.
:

Еще один аспект унифицированной объектной модели Scala – каждая операция является отправкой сообщения, то есть, вызовом метода. Например, сложение x+y интерпретируется как x.+(y), т.е. как вызов метода + с x в качестве объекта-приемника и y в качестве аргумента метода. Эта идея, впервые реализованная в Smalltalk, адаптирована к более традиционному синтаксису Scala следующим образом. Во-первых, Scala рассматривает имена операторов как обычные идентификаторы. Точнее, идентификатор – это либо последовательность букв и цифр, начинающаяся с буквы, либо последовательность операторных символов. Таким образом, можно определять, например, методы с именами +, <= или :: Далее, Scala трактует идентификатор, находящийся между двумя выражениями, как вызов метода. Например, в листинге 1 можно было бы использовать синтаксис операторов (arg startsWith "-") как "синтаксический сахар" для более традиционного синтаксиса (arg.startsWith("-")).

... << RSDN@Home 1.2.0 alpha rev. 591>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: Перегрузка == героин?
От: Павел Кузнецов  
Дата: 08.08.05 19:09
Оценка: 8 (1)
P.S.

>> Ну а банальный foreach реализовать нельзя. Или таки можно в виде огромной груды шаблонов?


> Таки можно http://boost-sandbox.sourceforge.net/libs/foreach/doc/html/


Вдруг, кому интересно посмотреть и на огромную груду шаблонов (и макросов)...

http://cvs.sourceforge.net/viewcvs.py/boost-sandbox/boost-sandbox/boost/foreach.hpp?view=markup
Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[13]: Перегрузка == героин?
От: adontz Грузия http://adontz.wordpress.com/
Дата: 08.08.05 14:19
Оценка: 5 (1)
Здравствуйте, Oyster, Вы писали:

O>Вы про C# StringBuilder? Это ж как надо перегружать, чтобы конкатенация через + была столь же эффективной (например, сборка строки в цикле)?


Надо просто отложить сборку до первого чтения строки
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[6]: Перегрузка == героин?
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.08.05 22:07
Оценка: 5 (1)
Здравствуйте, Кодёнок, Вы писали:

Кё>Возможно, для конкатенации лучше использовать & (and). Тогда (1 2 3) & (3 4 5) -> (1 2 3 3 4 5), а (1 2) + (3 3) -> (4 5).


О, блин, класс! С точки зрения логики "&" это операция "И" и стало быть разуный результат для "(1 2 3) & (3 4 5)" должен быть "()". Правда что для Ч(1 2 3) & (3 4 С++, что для Шарпа списки так не записывают. Да и логические операции над значением символов смысла не имеют. Это только для списков целых пригодно.

В общем, нужно хоть немножко отвлекаться от ФЯ и возвращаться к реалиям того что обсуждается. Строки есть строки. И для них использование "+" как оператора конкатинации совершенно нормально и общепринято. В том же SQL-е это сплошь и рядом.
... << RSDN@Home 1.2.0 alpha rev. 591>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[9]: Перегрузка == героин?
От: Трурль  
Дата: 09.08.05 13:30
Оценка: 5 (1)
Здравствуйте, ansi, Вы писали:

A>
  • Строка. Упорядоченный набор символов. Нет аналога в математике.
    A>Для строки не существует математических операций (потому как арифметические операции над символами не имеют смысла). Но существует "родная" операция:
    A>[list]
    A>
  • Конкатенация (слияние). Знак: +. Не коммутативно.

    В математике есть строки, а операция конкатенации обычно не обозначется (реже обозначется ||).
  • Re[9]: Перегрузка == героин?
    От: Quintanar Россия  
    Дата: 09.08.05 14:35
    Оценка: 1 (1)
    Здравствуйте, ansi, Вы писали:

    A>[list=1]

    A>
  • Массив, список. Не моделирует ничего. Просто упорядоченный набор данных.
    A>Математические операции неприменимы. Но вроде как должна быть операция соединения. Как лучше ее обозначить... Наверное все-таки +.

    Чем лучше-то? Тем, что когда-то кто-то не подумав стал ее для этого использовать? Конкатенация объектов есть в математике (это суперпозиция функций, например) и она обладает определенными свойствами — например, ассоциативностью, нулевым элементом.

    A>
  • Вектор. Упорядоченный набор координат (по-моему, допустимы только числа) в n-мерном пространстве (либо в бесконечномерном).
    A>Для вектора существуют следующие основные математические операции:
    A>

      A>
    • Сумма (покомпонентное сложение). Математический знак: +.
      A>
    • Разность (покомпонентная разность, если не ошибаюсь). Математический знак: -.
      A>
    • Скалярное произведение. Математический знак: ·, "пустой символ", а так же скобки. Пока используется только первый, но для удобства заменяется *.
      A>
    • Векторное произведение. Математический знак: не выражается в ASCII (похоже на латинскую x). Варианты опять же приветсвуются.
      A>

    Вектор — это просто одномерный массив, а по простому отображение множества {1..N} в множество некоторых элементов. В твоем примере сразу виден порочный подход к перегрузке операторов, типичный для "свободного" С++ника. Арифметическое произведение использовано для скалярного произведения, чем сразу же нарушаются все мыслимые свойства операции *, которые мы вправе от нее ожидать. Использовать * для векторного произведения тоже нельзя, поскольку векторное произведение не коммутативно.

    A>
  • Матрица. Примерное определение сочинить не в силах почему-то . Ну, скажем табличка из чисел .
    A>Для матрицы существуют следующие основные математические операции:
    A>

      A>
    • Сумма (покомпонентное сложение). Математический знак: +.
      A>
    • Разность (покомпонентная разность). Математический знак: -.
      A>
    • Произведение. Математический знак: не выражается в ASCII (похоже на латинскую x). Заменяется на *.
      A>
    A>Такие операции, как транспонирование, обращение и пр. приходится выражать функциями (т.е. символьными именами).

    Матрица — это тоже самое, что вектор, только отображение будет из {1...N}*{1...M} -> A.
    Сумма и разность, естественно, будут работать, поскольку это группа. Но умножение не коммутативно, что легко может ввести в заблуждение.

    A>
  • Строка. Упорядоченный набор символов. Нет аналога в математике.
    A>Для строки не существует математических операций (потому как арифметические операции над символами не имеют смысла). Но существует "родная" операция:
    A>

      A>
    • Конкатенация (слияние). Знак: +. Не коммутативно.
      A>

    Есть аналог. В частности в теории грамматик. Естественно, арифметические операции над строками смысла не имеют, поэтому не надо использовать символ арифметической операции для конкатенации строк.

    A>Почти все эти объекты — просто иное толкование массива, или списка (ну или двумерных в случае матрицы). Т.е. физически — это все одно и то же, но семантически — это разные вещи. Вопрос в том, что нужно вам?


    Нет, все это частные случаи отображений в случае теории множеств.

    A>Это стандартные обозначения, которые думаю знает каждый. Если надо нечто такое, что не попадает ни под один из этих объектов, то вся ответственность по выбору символов операций и их семантике полностью на вашей совести.


    В математике есть определенная иерархия структур типа полугруппа, группа, ассоциативная группа, полукольцо, кольцо и т.д. Все что встречается на практике неизбежно попадает под одно из определений, так что особо думать не надо.
  • Re[4]: Перегрузка == героин?
    От: StanislavK Великобритания  
    Дата: 08.08.05 07:19
    Оценка: -1
    Здравствуйте, Oyster, Вы писали:

    O>Здравствуйте, StanislavK, Вы писали:


    >>>>>Overloading function names saves time during writing by saving keystrokes and, more significantly, saves the mental effort of thinking up unique names.


    A>>>Мда, а автор похоже сам сидит на героине! Оказывается перегрузка операторов нужна, чтобы экономить 2 символа и писать + вместо add


    SK>>Просвети, кстати, зачем, если не для этого?


    O>Для лучшего отражения той или иной метафоры в коде. Например, два комплексных числа логичней складывать как a + b, а не a.Add(b).


    Напиши a.plus(b). Чем это хуже a + b никак понять не могу.
    Re[5]: Перегрузка == героин?
    От: eao197 Беларусь http://eao197.blogspot.com
    Дата: 08.08.05 07:22
    Оценка: +1
    Здравствуйте, StanislavK, Вы писали:

    A>>>>Мда, а автор похоже сам сидит на героине! Оказывается перегрузка операторов нужна, чтобы экономить 2 символа и писать + вместо add


    SK>>>Просвети, кстати, зачем, если не для этого?


    O>>Для лучшего отражения той или иной метафоры в коде. Например, два комплексных числа логичней складывать как a + b, а не a.Add(b).


    SK>Напиши a.plus(b). Чем это хуже a + b никак понять не могу.


    Тем, что ((a+b)/2 + c) лучше, чем a.plus(b).div(2).plus(c).
    ... << RSDN@Home 1.1.4 stable rev. 510>>


    SObjectizer: <микро>Агентно-ориентированное программирование на C++.
    Re[9]: Перегрузка == героин?
    От: eao197 Беларусь http://eao197.blogspot.com
    Дата: 08.08.05 08:53
    Оценка: +1
    Здравствуйте, Трурль, Вы писали:

    Т>Могло быть и что-то вроде

    Т>
    Т>std::cout.print("My data: " ).print(my_data).print(", your data: ").print(your_data).nl.flush;
    Т>


    Как раз и нет. Ведь print -- это метод std::ofstream и как же мне добавить перегрузку метода print в класс std::ofstream для своего типа?
    ... << RSDN@Home 1.1.4 stable rev. 510>>


    SObjectizer: <микро>Агентно-ориентированное программирование на C++.
    Re[6]: Перегрузка == героин?
    От: cranky Украина  
    Дата: 08.08.05 09:02
    Оценка: -1
    Здравствуйте, Oyster, Вы писали:

    O>Здравствуйте, cranky, Вы писали:


    O>>>Да. Понятие сложения. Для чисел результат — сумма, для строк — конкатенация. Но метафорический смысл един

    C>>Ну да.
    ("Hello world"-"world") ? "Hello "
    Или иначе: как отнимать строки, если сложение (в виде конкатенации) возможно?

    C>>В случае соединения строк мне больше нравится введение нового оператора в язык, например, тильда в D.

    O>Меня не поняли

    O>Re[7]: Перегрузка == героин?
    Автор: Oyster
    Дата: 08.08.05

    Да всё понятно. Но таки конкатенация — никаким боком не сложение, даже в программировании. И, на мой взгляд, это неправильно, когда в стандартной библиотеке (хорошо, что не в самом языке) для строк применяется оператор+. Если нет более подходящего, тогда уж лучше функции concat или strcat. Ведь никто не будет с аналогичной целью вводить + для векторов?

    O>>>Но вот, например, "<<" в C++ и оператор побитового сдвига, и оператор вывода в поток — вот тут уже явно разные понятия.

    C>>С++ вообще проектировался по принципу минимальных нововведений в синтаксис языка, отсюда и операторы в/в потоков, и обозначение ЧВФ, и некоторые другие вещи.

    O>И мабуть, это таки правильно. На C++ мне нравилось писать std::cout << 1 << " is not " << 2. Но я не спрашивал "почему", я писал "вот, смотрите, тут у них разный смысл".

    Просто так, на всякий случай напомнить, почему так получилось...
    You aren't expected to absorb this
    Re[7]: Перегрузка == героин?
    От: Oyster Украина https://github.com/devoyster
    Дата: 08.08.05 09:11
    Оценка: +1
    Здравствуйте, cranky, Вы писали:

    O>>>>Да. Понятие сложения. Для чисел результат — сумма, для строк — конкатенация. Но метафорический смысл един

    C>>>Ну да.
    ("Hello world"-"world") ? "Hello "
    Или иначе: как отнимать строки, если сложение (в виде конкатенации) возможно?

    C>>>В случае соединения строк мне больше нравится введение нового оператора в язык, например, тильда в D.

    O>>Меня не поняли

    O>>Re[7]: Перегрузка == героин?
    Автор: Oyster
    Дата: 08.08.05

    C>Да всё понятно. Но таки конкатенация — никаким боком не сложение, даже в программировании. И, на мой взгляд, это неправильно, когда в стандартной библиотеке (хорошо, что не в самом языке) для строк применяется оператор+. Если нет более подходящего, тогда уж лучше функции concat или strcat. Ведь никто не будет с аналогичной целью вводить + для векторов?

    Да-да-да... но мне всё равно удобнее писать +

    Кстати, а почему нельзя перегрузить + для векторов? Вот, скажем, у меня мат. либа для операций над векторами и матрицами...

    O>>>>Но вот, например, "<<" в C++ и оператор побитового сдвига, и оператор вывода в поток — вот тут уже явно разные понятия.

    C>>>С++ вообще проектировался по принципу минимальных нововведений в синтаксис языка, отсюда и операторы в/в потоков, и обозначение ЧВФ, и некоторые другие вещи.

    O>>И мабуть, это таки правильно. На C++ мне нравилось писать std::cout << 1 << " is not " << 2. Но я не спрашивал "почему", я писал "вот, смотрите, тут у них разный смысл".

    C>Просто так, на всякий случай напомнить, почему так получилось...

    Ггы. Значит, << можно, а + нет? Нечестно!
    Re[9]: Перегрузка == героин?
    От: eao197 Беларусь http://eao197.blogspot.com
    Дата: 08.08.05 09:33
    Оценка: +1
    Здравствуйте, VladD2, Вы писали:

    VD>Справидливости ради можно заметить, что потенциально можно сделать функцию с переменным числом полиморфных параметров Тогда код выглядел бы так:

    VD>
    VD>PrintLine("My data: ", my_data, ", your data: ", your_data);
    VD>

    VD>или так:
    VD>
    VD>Console.WriteLine("My data: {0}, your data: {1}", my_data, your_data);
    VD>

    VD>А в некоторых языках можно даже так:
    VD>
    VD>PrintLine("My data: {my_data}, your data: {your_data}");
    VD>

    VD>Откровенно говоря последний вариант мне нравится значитально больше остальных.

    Справедливости ради можно добавить, что в зависимости от левого операнда оператора сдвига выполняемое действие может очень сильно меняться:
    // Просто печатаем на поток вывода.
    std::cout << my_data << std::endl;
    
    // Получаем XML сериализацию.
    Xml_Serializer xml;
    xml << my_data;
    
    // Получаем ASN1 PER сериализацию.
    Asn1per_Serializer asn1;
    asn1 << my_data;
    
    // Вычисляем MD5-хеш двоичного образа.
    Md5_Hash hash;
    hash << my_data;


    Особенно здорово такой полиморфизм использовать в сочетании с шаблонами:
    template< class Stream, class Data >
    class Some_Functor
        {
            Stream & stream_;
        public :
            Some_Functor( Stream & stream )
                :    stream_( stream )
                {}
                
            void
            operator( const Data & data )
                {
                    <...bla-bla-bla...>
                    stream_ << data;
                    <...bla-bla-bla...>
                }
        };
    
    ...
    std::for_each( my_data_list.begin(), my_data_list.end(),
        Some_Functor< Xml_Serializer, My_Data >( xml ) );
    std::for_each( my_data_list.begin(), my_data_list.end(),
        Some_Functor< Asn1per_Serializer, My_Data >( asn1 ) );
    std::for_each( my_data_list.begin(), my_data_list.end(),
        Some_Functor< Md5_Hash, My_Data >( hash ) );
    ... << RSDN@Home 1.1.4 stable rev. 510>>


    SObjectizer: <микро>Агентно-ориентированное программирование на C++.
    Re[8]: Перегрузка == героин?
    От: Andrei N.Sobchuck Украина www.smalltalk.ru
    Дата: 08.08.05 10:27
    Оценка: -1
    Здравствуйте, Oyster, Вы писали:

    ANS>>Я согласен с тем
    Автор: Трурль
    Дата: 08.08.05
    , что конкатенация и сложение это разные вещи, и, соответсвенно, не согласен с тем, что это по сути одно и то же. Взять хотябы коммутативность.


    O>Понятно. Я говорил как программист, а не как математик. Как для программиста, для меня достаточно удобно и понятно писать "abc" + "def" вместо "abc".concat("def"). Это и означает "добавление одного значения к другому" для строки.


    Как по мне, то есть более приемлемый вариант — введение нового оператора, a-la "&" в VB, "," в ST или упоминавшееся выше "~" в D.
    Кстати, в развитие темы, зачем ограничиваться строками? В ST "," применим ко всем упорядоченным коллекциям. Типа:
    #(1 2 3) , #(4 5 6)
    Результат #(1 2 3 4 5 6)
    ... << RSDN@Home 1.1.4 stable rev. 510>>
    Я ненавижу Hibernate
    Автор: Andrei N.Sobchuck
    Дата: 08.01.08
    !
    Re[9]: Перегрузка == героин?
    От: Oyster Украина https://github.com/devoyster
    Дата: 08.08.05 10:41
    Оценка: +1
    Здравствуйте, Andrei N.Sobchuck, Вы писали:

    O>>Понятно. Я говорил как программист, а не как математик. Как для программиста, для меня достаточно удобно и понятно писать "abc" + "def" вместо "abc".concat("def"). Это и означает "добавление одного значения к другому" для строки.


    ANS>Как по мне, то есть более приемлемый вариант — введение нового оператора, a-la "&" в VB, "," в ST или упоминавшееся выше "~" в D.

    ANS>Кстати, в развитие темы, зачем ограничиваться строками? В ST "," применим ко всем упорядоченным коллекциям. Типа:
    ANS>#(1 2 3) , #(4 5 6)
    ANS>Результат #(1 2 3 4 5 6)

    Согласен, но такая фича должна быть встроена в язык. Т.е. из тех операторов, что есть в C++ (C#), наилучший кандидат — именно +. И использовать его для конкатенации строк не есть зло.
    Re[8]: Перегрузка == героин?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 08.08.05 11:03
    Оценка: +1
    Здравствуйте, Oyster, Вы писали:

    O>Обычно я не оверквочу, но мне пришлось оставить самую первую фразу:


    Так и нужно было сделать вот так:
    >>>>>>Overloading function names saves time during writing by saving keystrokes and, more significantly, saves the mental effort of thinking up unique names...
    ANS>В критикуемой цитате об этом и говорится.

    Неужели трудно грохнуть незначащий текст. Все равно никто перечитывать эту кучу текста не будет и твоя задумка не удастся.
    ... << RSDN@Home 1.2.0 alpha rev. 591>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[11]: Перегрузка == героин?
    От: eao197 Беларусь http://eao197.blogspot.com
    Дата: 08.08.05 11:18
    Оценка: +1
    Здравствуйте, VladD2, Вы писали:

    VD>Здравствуйте, eao197, Вы писали:


    E>>Справедливости ради можно добавить, что в зависимости от левого операнда оператора сдвига выполняемое действие может очень сильно меняться


    VD>О, да. От смены функции тоже.


    Влад, ты что, сейчас ответил, чтобы ответить?
    Ведь если пытаться с помощь функций выражать операции помещения объекта в какой-то специфический поток, то желательно, чтобы функции имели осмысленные имена:
    print( std::cout, my_data );
    serialize( xml, my_data );
    serialize( asn1, my_data );
    calculate( hash, my_data );

    а не:
    shift( std::cout, my_data );
    shift( xml, my_data );
    shift( asn1, my_data );
    shift( hash, my_data );


    А если функции помещения объекта куда-то именются по разному, то писать обобщенный код становится сложнее.
    ... << RSDN@Home 1.1.4 stable rev. 510>>


    SObjectizer: <микро>Агентно-ориентированное программирование на C++.
    Re[10]: Перегрузка == героин?
    От: Andrei N.Sobchuck Украина www.smalltalk.ru
    Дата: 08.08.05 11:32
    Оценка: -1
    Здравствуйте, Oyster, Вы писали:

    ANS>>Как по мне, то есть более приемлемый вариант — введение нового оператора, a-la "&" в VB, "," в ST или упоминавшееся выше "~" в D.

    ANS>>Кстати, в развитие темы, зачем ограничиваться строками? В ST "," применим ко всем упорядоченным коллекциям. Типа:
    ANS>>#(1 2 3) , #(4 5 6)
    ANS>>Результат #(1 2 3 4 5 6)

    O>Согласен, но такая фича должна быть встроена в язык. Т.е. из тех операторов, что есть в C++ (C#), наилучший кандидат — именно +. И использовать его для конкатенации строк не есть зло.


    Я потому своё несогласие в виде минуса расписывать не стал, что это во многом не формализуемую ощущение правильности. Тебе кажется это правильно, мне — нет. А аргументов типа "вон там ракета бабахнула из-за исспользования + для конкатенации" у меня нет.
    И вообще, нечего тут сокращать, ибо для конкатенации множества строк всё равно прийдётся StringBuilder создавать.
    ... << RSDN@Home 1.1.4 stable rev. 510>>
    Я ненавижу Hibernate
    Автор: Andrei N.Sobchuck
    Дата: 08.01.08
    !
    Re[3]: Перегрузка == героин?
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 08.08.05 11:35
    Оценка: +1
    Здравствуйте, StanislavK, Вы писали:

    SK>Просвети, кстати, зачем, если не для этого?


    Единообразием использования встроенного и пользовательского типов. Ты же пишешь (3+4)/5 а не 3.add(4).div(5).
    Например если в шаблонный класс для подсчёта корней уравнения вместо double подставить какой-нибудь класс для вычислений с повышенной точностью вместо double, то код шаблонного класса не надо будет менять.
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[6]: Перегрузка == героин?
    От: ansi  
    Дата: 08.08.05 12:21
    Оценка: +1
    Здравствуйте, Кодёнок, Вы писали:

    Кё>Конкатенация и сложение два разных оператора. Другие языки специально для конкатенации используют не +.


    Кё>Возможно, для конкатенации лучше использовать & (and). Тогда (1 2 3) & (3 4 5) -> (1 2 3 3 4 5), а (1 2) + (3 3) -> (4 5).


    Побитовое И?

    В ПХП, например, — это точка. Но точка там, насколько я помню, не используется для доступа к членам класса, поэтому вполне допустима с этой точки зрения. В Си++ я не вижу символа более подходящего, чем +.
    new RSDN@Home(1.1.4, 303) << new Message(); std::head::ear << "Metallica — Enter Sandman";
    Re[7]: Перегрузка == героин?
    От: Nose Россия  
    Дата: 08.08.05 15:24
    Оценка: +1
    Здравствуйте, cranky, Вы писали:

    O>>Меня не поняли

    O>>Re[7]: Перегрузка == героин?
    Автор: Oyster
    Дата: 08.08.05

    C>Да всё понятно. Но таки конкатенация — никаким боком не сложение, даже в программировании. И, на мой взгляд, это неправильно, когда в стандартной библиотеке (хорошо, что не в самом языке) для строк применяется оператор+. Если нет более подходящего, тогда уж лучше функции concat или strcat. Ведь никто не будет с аналогичной целью вводить + для векторов?

    Не сложение, конечно, если строго говорить. Но вот в сознании программиста -- вполне естественно "складывать" строки, не коряво звучит. Привычка?

    Кроме того, типичное применение (псевдокод) :


        strcat( string("Error ") , strcat( to_string(errNum) , strcat( string(" while proc...."), to_string( objNum ) ) ) );


    вместо 3-х знаков "+"... не страшно?


    Идеологически правильный вариант грозит нечитаемым кодом...

    П.С. так и тянуло сказать "оверхед"
    ... << RSDN@Home 1.1.4 beta 7 rev. 447>>
    Re[13]: Перегрузка == героин?
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 08.08.05 15:27
    Оценка: :)
    Здравствуйте, Andrei N.Sobchuck, Вы писали:

    A>>Для того чтобы конкатекация была эффективной? Вовсе нет StringBuilder это излишество вызванное как раз неиспользованием перегрузки операторов.

    ANS>Сомневаюсь, что даже использование перегрузки операторов поможет избавиться от этого излишиства.

    Сомневаться не надо, я сам написал строковый класс на C++, который кроме всего прочьего оптимизировал конкатекацию без вмешательсва программиста.
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[15]: No String Builder
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 08.08.05 15:58
    Оценка: +1
    Здравствуйте, Oyster, Вы писали:

    O>Как вариант... но StringBuilder всё равно выходит функциональнее и [немного] эффективнее (надо же в таком случае внутри хранить некий список конкатенируемых строк, даже скорее дерево, — накладные расходы на это).

    O>А вообще идея хорошая

    На самом деле если не мучать себя реализацией, то можно сделать так
    string a = b + c + d + e;
    оптимизируется
    string a;
    for (...)
    {
     a += "abcd";
    }
    не оптимизируется
    string_result b;
    for (...)
    {
     b += "abcd";
    }
    string a = b;
    оптимизируется.

    string_result это просто vector< some_smart_ptr<string> >

    Всё это делается очень на основе очень простой идеи
    string_result operator + (const string &, const string &);
    string_result operator + (const string_result &, const string &);
    string_result operator + (const string &, const string_result &);
    string & operator = (const string &, const string &);
    string & operator = (const string &, const string_result &);


    Именно string_builder с явным методом add не нужен, а сам класс строки не перегружен лишними вещами. Я именно на такой реализации и остановился.
    С другой стороны как продолжение идеи конечно неплохо было бы кое что перенести в compile time, но на фоне копирования строк это копейки.
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[10]: Перегрузка == героин?
    От: Quintanar Россия  
    Дата: 08.08.05 16:39
    Оценка: +1
    Здравствуйте, cranky, Вы писали:

    Q>>Идеологически правильный вариант — выбрать другое обозначение для операции конкатенации. Ибо конкатенация по сути — это слияние списков, а не сложение.


    C> Ну это совсем идеалистический вариант — представление строки списком, всё-таки нечто с рандомным доступом подошло бы лучше.


    Это не совсем идеалистический вариант, кое-где так и сделано. Кроме того, никто не говорит о том, что обязательно нужно представлять строку списком, речь идет о том, что конкатенация по сути — это слияние списков, а не арифметическре сложение, и логично для этого использовать другое обозначение.
    Re[7]: Перегрузка == героин?
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 08.08.05 17:53
    Оценка: +1
    Здравствуйте, Quintanar, Вы писали:

    Q>Это С++ так на вас влияет? Ведь ясно же, что имелась в виду свобода не думать о мелочах, а заняться более серьезными делами.


    А я и не думаю о мелочах Если дурак-коллега не решил, что & это способ конкатекации строк, то я о мелочах типа "а какое действие выполняет этот перегруженный оператор?" вообще не думаю.
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[13]: Перегрузка == героин?
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 08.08.05 22:14
    Оценка: -1
    Здравствуйте, VladD2, Вы писали:

    A>>Для того чтобы конкатекация была эффективной? Вовсе нет StringBuilder это излишество вызванное как раз неиспользованием перегрузки операторов.

    VD>Причем тут перегрузка?

    При том, что если тип string встроенный и поддерживается только
    string operator + (const string &, const string &)

    То нужен StringBuilder но если можно перегрузить
    MyType1 operator + (const MyType2 &, const string &)
    MyType1 operator + (const string &, const MyType2 &)

    то необходимости в StringBuilder'е как средстве повышения эффективности конкатекации строк нету. Доказано на практике
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[9]: Перегрузка == героин?
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 09.08.05 03:02
    Оценка: +1
    Здравствуйте, Andrei N.Sobchuck, Вы писали:
    ANS>Как по мне, то есть более приемлемый вариант — введение нового оператора, a-la "&" в VB, "," в ST или упоминавшееся выше "~" в D.
    Страуструп, имхо, предоставил достаточно понятное объяснение отсутствию механизма введения "новых" операторов в язык.
    А использование "готового старого" оператора для конкатенации строк все равно требует наличия перегрузки операторов.
    ... << RSDN@Home 1.1.4 beta 5 rev. 395>>
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[9]: Перегрузка == героин?
    От: Курилка Россия http://kirya.narod.ru/
    Дата: 09.08.05 07:42
    Оценка: -1
    Здравствуйте, Quintanar, Вы писали:

    Q>Здравствуйте, Геннадий Васильев, Вы писали:


    ГВ>>Дело-то как раз в том, что на плюсовиков (по моим наблюдениям) перечисленные мелочи не так уж сильно и влияют, если речь идёт о серьёзных делах. И "километровые объявления шаблонных типов" — не проблема, а естественное следствие самих шаблонов (не хочешь — не пользуй). И управление памятью — не проблема, а полезная фича. А закорючки... у любого языка свои закорючки. Даже у LISP.


    Q>Скажите честно, зачем вам управлять памятью? Вы пишете real time систему или игру, на худой конец? Ведь математик не изобретает каждый раз все с нуля, а использует имеющийся базис, чтобы идти вперед и не иметь дела с посторонними в общем-то вещами. И так везде. Если сильно надо, можно откатиться назад и пересмотреть основы — написать свой GC, свою систему классов и т.п. Но как правило, это не нужно.


    +
    Как сказал Хоар: Premature optimization is the root of all evil.
    Re[20]: No String Builder
    От: Oyster Украина https://github.com/devoyster
    Дата: 09.08.05 08:38
    Оценка: +1
    Здравствуйте, adontz, Вы писали:

    VD>>Я тебе уже третий раз повторяю, что в Шапре подобный код выливается в вызов функции string.Concat(). А эффективнее нее уже ничего не найти.


    A>Влад, учи матчасть a.Concat(b.Concat(c.Concat(d))) это мягко говоря не самый эффективный код.


    ??? Оно преобразуется в System.String.Concat(a, b, c, d) , так что непонятно, о чём вы.
    Re[10]: Перегрузка == героин?
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 09.08.05 08:40
    Оценка: -1
    Здравствуйте, Курилка, Вы писали:

    К>+

    К>Как сказал Хоар: Premature optimization is the root of all evil.

    -1 за знание предмета.

    Во-первых, это сказал Робет Флойд. Во-вторых это толкьо часть цитаты. А вот полностью
    "We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil."
    его высказывание имеет совсем другой смысл.
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[21]: No String Builder
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 09.08.05 08:43
    Оценка: -1
    Здравствуйте, Oyster, Вы писали:

    O>??? Оно преобразуется в System.String.Concat(a, b, c, d) , так что непонятно, о чём вы.


    Да ну? Я между прочим не наобум сказал, а сгенерированный код поглядел
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[24]: No String Builder
    От: Oyster Украина https://github.com/devoyster
    Дата: 09.08.05 09:02
    Оценка: +1
    Здравствуйте, adontz, Вы писали:

    O>>>>??? Оно преобразуется в System.String.Concat(a, b, c, d) , так что непонятно, о чём вы.

    A>>>Да ну? Я между прочим не наобум сказал, а сгенерированный код поглядел
    O>>Код:

    A>ОК, может быть для .Net я погорячился. Но в Си++ таких оптимизаций точно нет


    Ваш с Владом диалог:

    VD>Я тебе уже третий раз повторяю, что в Шапре подобный код выливается в вызов функции string.Concat(). А эффективнее нее уже ничего не найти.

    Влад, учи матчасть a.Concat(b.Concat(c.Concat(d))) это мягко говоря не самый эффективный код.


    Так что мой ответ был по самому существу...
    Re[24]: No String Builder
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 09.08.05 11:00
    Оценка: :)
    Здравствуйте, adontz, Вы писали:

    A>ОК, может быть для .Net я погорячился. Но в Си++ таких оптимизаций точно нет


    Вот и забудь про него.
    ... << RSDN@Home 1.2.0 alpha rev. 591>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[5]: Перегрузка == героин?
    От: vdimas Россия  
    Дата: 09.08.05 13:03
    Оценка: +1
    Здравствуйте, StanislavK, Вы писали:

    SK>Напиши a.plus(b). Чем это хуже a + b никак понять не могу.


    Есть такое скромное понятие — выразительность языка. Некоторые "нежадные" языки позволяют делиться с нами этой выразительностью в виде возможности перегрузки операций для собственных типов.

    Я думаю, что в школе, ты бы не далеко ушел даже в начальной математике, если бы все детcво писал вместо A*(B+C) нечто вроде этого набора бреда: A.MULTIPLY(B.PLUS(C)). А как именно бы ты изучал тему раскрытия скобок и упрощения выражений в 4-м классе — вообще не понятно.

    Для человека все еще критично такое понятие — как способность к восприятию информации. Соответственно, желательно так представлять информацию, что бы она воспринималась наилучшим образом.
    Re[30]: No String Builder
    От: Oyster Украина https://github.com/devoyster
    Дата: 09.08.05 13:10
    Оценка: +1
    Здравствуйте, adontz, Вы писали:

    O>>Ассемблерный код чего, простите? .NET-приложения компилируются в код на IL, который затем выполняется рантаймом. Вот этот IL я и смотрю Reflector-ом...


    A>Это как? C# Compiler генерирует IL. Но IL не выполняется, .Net Framework его сперва компилирует в машинный код (ассемблер просто более человечное его представление).


    Это я и назвал "исполнение IL рантаймом". И ежу понятно, что неспециализированный процессор IL-код не проглотит.

    A>Вот сгенерированный ассемблерный код я и глядел


    С помошью чего глядели? Можно пример в студию (в котором много вызовов string.Concat вместо одного)?
    Re[26]: No String Builder
    От: Oyster Украина https://github.com/devoyster
    Дата: 09.08.05 13:25
    Оценка: +1
    Здравствуйте, Andrei N.Sobchuck, Вы писали:

    ANS>Я к тому, что верхняя запись не преобразуется же в нижнюю. Которая, суть более оптимальній вариант.


    А почему вы решили, что

    // это то, во что преобразится string z = x + GenerateLongString()+y;
    string z = string.Concat(x, GenerateLongString(), y);

    будет оптимальнее, чем

    ANS>>>
    ANS>>>    aStringBuilder.append(x);
    ANS>>>    GenerateLongString(aStringBuilder);
    ANS>>>    aStringBuilder.append(y);
    ANS>>>

    ? Я думаю, что это не так — внутри string.Concat наверняка тоже вполне грамотный код конкатенации строк.
    Re[31]: No String Builder
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 09.08.05 14:09
    Оценка: :)
    Здравствуйте, Oyster, Вы писали:

    A>>Вот сгенерированный ассемблерный код я и глядел

    O>С помошью чего глядели? Можно пример в студию (в котором много вызовов string.Concat вместо одного)?

    Debug\Windows\Disassembly. Для того чтобы поглядеть в релизе надо unmanaged debugging включить.
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[10]: Перегрузка == героин?
    От: Quintanar Россия  
    Дата: 09.08.05 14:44
    Оценка: +1
    Здравствуйте, adontz, Вы писали:

    A>Ну так это проблема "обезьяны с гранатой". Если ты не доверяешь человеку настолько, чтобы подпускать его к Си++ — не подпускай. си++ язык требующий высокого профессионального уровня. Именно требующий. Это не VB и "среднестатистический ламерок не разобрался" неуместный упрёк. Си++ и не расчитан на то, чтобы в нём кто попало разбирался. Язык мощный но вместе с тем и сложный.


    Это вы намекаете, что С++ существует только для "посвященных" в тайные знания программистов, элиты мирого кодирования. Если так, что же на нем пишут все кому не лень?

    Q>>Ну использовать + для "сложения" строк вам же приходит в голову, хотя конкатенация строк к сложению никакого отношения не имеет.

    A>Это общепринятое обозначение. Оно применяется не только для std::string но и для многих других строк и не только в Си++. То что + применяется для конкатекации это даже если и недостаток, то уж точно не Си++'овый.

    Бредовое обозначение, и то, что оно почему-то употребляется в С++, меня не волнует.
    Re[33]: No String Builder
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 09.08.05 14:56
    Оценка: :)
    Здравствуйте, Oyster, Вы писали:

    O>Как видите, сначала идут 4 call к SomeFuncReturningString(), а потом только один call string.Concat. Выходит, вы неправы, уважаемый adontz?


    Хммм странно. Я постараюсь создать минимальный проект повторяющий отсутсвие оптимизации.
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[30]: No String Builder
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 09.08.05 19:15
    Оценка: -1
    Здравствуйте, adontz, Вы писали:

    A>Это как? C# Compiler генерирует IL. Но IL не выполняется, .Net Framework его сперва компилирует в машинный код (ассемблер просто более человечное его представление). Вот сгенерированный ассемблерный код я и глядел


    Ой, а может поделишся как ты это делашь? Я лично знаю только один способ и им чертовски не удобно пользоваться. Но этот способ не подразумевает что в ехе-шнике может быть ассеблерный код. Все же джит и все такое...

    Правда к делу это отношения не имеет, так как подстановка string.Concat делается компилятором C# и смотреть ассемблер не нужно.
    ... << RSDN@Home 1.2.0 alpha rev. 591>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[32]: No String Builder
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 09.08.05 19:15
    Оценка: -1
    Здравствуйте, adontz, Вы писали:

    A>Debug\Windows\Disassembly.


    Ух ты! А это где?

    A> Для того чтобы поглядеть в релизе надо unmanaged debugging включить.


    В чем? И зачем?
    ... << RSDN@Home 1.2.0 alpha rev. 591>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[25]: No String Builder
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 09.08.05 19:15
    Оценка: -1
    Здравствуйте, Oyster, Вы писали:

    VD>>>Врешь.


    A>>Мда. Приехали


    O>Почему это? Ты же говорил, что смотрел сгенерированный код, верно? Я давал пример, опровергавший твоё утверждение: Re[22]: No String Builder
    Автор: Oyster
    Дата: 09.08.05
    . Ну и кто тут неправ?


    Это видимо такая неуклюжая попытка сохранить хорошую мину при плохой игре. Мол переход на личности и все такое. Не признавать, же что ничего не смотрел?
    ... << RSDN@Home 1.2.0 alpha rev. 591>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[26]: No String Builder
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 09.08.05 19:26
    Оценка: :)
    Здравствуйте, VladD2, Вы писали:

    VD>Это видимо такая неуклюжая попытка сохранить хорошую мину при плохой игре. Мол переход на личности и все такое. Не признавать, же что ничего не смотрел?


    Да нет, я понял о чём я говорил и это не совсем то о чём говорил ты. Вобщем код ниже аналогичен использованию StringBuilder.Append гораздо медленнее его, не оптимизируется никаким C# компилятором и может быть оптимизирован за счёт перегрузки операторов (без изменения того куска кода который я привёл, разве что тип будет уже не string).
    string a = "qwerty";
    a += "asdfgh";
    a += "asdfgh";
    a += "asdfgh";
    a += "asdfgh";


    Возражения есть?
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[28]: No String Builder
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 09.08.05 19:53
    Оценка: :)
    Здравствуйте, VladD2, Вы писали:

    VD>Нет. На этот раз никаких. А что?


    Я счастлив
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[2]: Перегрузка == героин?
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 09.08.05 22:36
    Оценка: +1
    Здравствуйте, Maxim S. Shatskih, Вы писали:

    MSS>Правильно все он пишет ИМХО. Сам такую же точно статью писал, но по-русски.


    Да? Ну-ка покажи!
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[14]: Перегрузка == героин?
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 10.08.05 07:45
    Оценка: +1
    Здравствуйте, Шахтер, Вы писали:

    Q>>>>Конструктор может позволить себе не заниматься такими мелочами, а сконцентрироваться на машине в целом.

    Ш>>>Неверно. Нет такой вещи -- машина в целом. Это только на картинке у художника так бывает. В инженерии целое есть сумма составных частей и качество этого целого определяется качеством каждого элемента, даже самого маленького.
    A>>Угу. И для каждого нового автомобиля заново придумывают болты и гайки? Гы-гы.
    Ш>Автомобили бывают разные. Очень разные.
    Ш>И болты и гайки тоже, между прочим.

    Вот в том-то всё и дело, что очень разные автомобили собираются из одинаковых болтов и шает. К твоему сведенью, кроме формы корпуса и внутренней отделки ничего особо уникального в автомобилях нету — двигатель, тормоза, аммортизаторы, колёса можно увидеть и на других моделях.
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[16]: Перегрузка == героин?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 10.08.05 10:09
    Оценка: :)
    Здравствуйте, Andrei N.Sobchuck, Вы писали:

    ANS>Однако ж, проще верблюда протолкнуть сквозь игольное ушко, чем тебе доказать хоть что нибудь.


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

    Не нужно искать свои проблемы в другий.
    ... << RSDN@Home 1.2.0 alpha rev. 591>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[12]: Перегрузка == героин?
    От: ansi  
    Дата: 10.08.05 10:52
    Оценка: +1
    Здравствуйте, adontz, Вы писали:

    A>Собственно а кто сказал, что на нём все кому не лень пишут? На Си++ пишет не так уж много людей. Вот на "Си с классами" огромное количество.


    А некоторые черезчур увлекаются "шаблонным" Си++
    new RSDN@Home(1.1.4, 303) << new Message(); std::head::ear << "Therion — Seawinds";
    Re[13]: Перегрузка == героин?
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 10.08.05 10:56
    Оценка: +1
    Здравствуйте, ansi, Вы писали:

    A>А некоторые черезчур увлекаются "шаблонным" Си++


    Истина где-то там...
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[8]: Перегрузка == героин?
    От: Курилка Россия http://kirya.narod.ru/
    Дата: 10.08.05 12:06
    Оценка: :)
    Здравствуйте, adontz, Вы писали:

    A>Здравствуйте, Курилка, Вы писали:


    К>>Т.е. фактов, кроме сказанного adontz нет? Замечательно


    A>Факт есть очень простой. Перегруженный оператор влияет не на конкретный класс, а на систему в целом. О того, что где-то перегрузили оператор в совсем другом месте может изменится поведения. Поэтому подходить к перегрузке надо ответсвенно. Это мощный, но вместе с тем сложный инструмент.


    Не спорю, так и есть. Автор статьи как раз и писал (на мой взгляд), что не оглядываясь на последствия можно получить неожиданные (плачевные) сюрпризы. И по-твоему из этого VladGal имел право обвинить автора в незнании предмета?
    На мой взгляд автор той статьи просто слишком сгущает краски — в плюсах много "опасных" мест, но никто же не перестаёт только из-за наличия грабель, которые умеешь обходить, на нём программировать?
    P.S. хотя перестают (вспоминая про Vlad2 ), но всёж понимают что и на плюсах при соотв. оглядке вполне получается нормальный код.
    Re[18]: Перегрузка == героин?
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 10.08.05 14:46
    Оценка: +1
    Здравствуйте, Quintanar, Вы писали:

    Q>Как это не может? Еще как может.


    Например какой язык строго типизированн и при этом более-менее широко применяется?

    Q>Я уже писал, что кое-где так и сделано ввиде Классов Типов. Т.е. нельзя реализовать + не реализовав — и нельзя реализовать + от аргументов разных типов.


    Вот то что нельзя, например, реализовать плюс от аргументов разных типов или плюс без минуса это очень плохо. Например у строки есть оператор += , но операции -= нету. У вектораров очевидно есть умножение (даже два), но нет ни одного деления. К строке я могу захотеть добавить символ, а к переменной типа int — тип short. Или даже к своему классу чисел повышенной точности int.
    В результате, как я уже и говорил, любые формальные ограничения на перегрузку не могут выразить мысли, идеи программиста и в конечном итоге будут только мешать, а не помогать, останутся невостребованными. В конце концов академические примеры надуманных ошибок и мощные средства борьбы с надуманными ошибками от практики программирования весьма далеки.
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[16]: Перегрузка == героин?
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 11.08.05 01:50
    Оценка: +1
    Здравствуйте, Шахтер, Вы писали:

    Ш>Двигатель у камаза и у жигулей один и тот же? А колёса?

    Ш>И тормоза одинаковые?

    А у 05/06/07?
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[19]: Перегрузка == героин?
    От: _vovin http://www.pragmatic-architect.com
    Дата: 11.08.05 09:50
    Оценка: +1
    Здравствуйте, adontz, Вы писали:

    A>Здравствуйте, Quintanar, Вы писали:


    Q>>Как это не может? Еще как может.


    A>Например какой язык строго типизированн и при этом более-менее широко применяется?


    Q>>Я уже писал, что кое-где так и сделано ввиде Классов Типов. Т.е. нельзя реализовать + не реализовав — и нельзя реализовать + от аргументов разных типов.


    A>Вот то что нельзя, например, реализовать плюс от аргументов разных типов или плюс без минуса это очень плохо. Например у строки есть оператор += , но операции -= нету. У вектораров очевидно есть умножение (даже два), но нет ни одного деления. К строке я могу захотеть добавить символ, а к переменной типа int — тип short. Или даже к своему классу чисел повышенной точности int.


    Тут у тебя все намешано в кучу, если разложить по полочкам, проблема исчезает.
    Во первых, сложение строк это операция конкатенации коллекций, а не арифмитическое сложение.
    Соответственно, можно ввести операторы ++ и ++= для которых семантически никаких вычитаний по определению не требуется.
    Далее, умножение векторов два рода: * и dotProduct. Для первого очень успешно опрелеляется /, для второго его нет по определению.
    Добавление символа к строке это ни арифметическое сложение, ни конкатенация коллекций, а просто add элемента в коллекцию.
    Сложение чисел отлично ложится на операцию + (Number, Number). Для частных случаев может быть создана специализация (например + (int, int)), для остальных — двойная диспетчеризация с последующим приведением чисел к одному вышестоящему общему типу.

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


    Формальные ограничения не нужны, но всегда нужно стремиться построить непротиворечивую модель операций и операторов, которая вести себя единообразно на всей системе.
    Re[18]: Перегрузка == героин?
    От: Павел Кузнецов  
    Дата: 11.08.05 13:19
    Оценка: +1
    Quintanar,

    > нельзя реализовать + от аргументов разных типов.


    Это странный тезис. Для тех же векторов в линейной алгебре определяют умножение на число. И матрицу можно умножить на вектор (при определенных условиях)...
    Posted via RSDN NNTP Server 2.0 beta
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[10]: Перегрузка == героин?
    От: pvgoran Россия  
    Дата: 12.08.05 14:39
    Оценка: :)
    Здравствуйте, VladD2, Вы писали:

    VD>В общем, пусть любой кинет в меня камень если он способен не понять кострукцию "строка 1 " + "строка 2".


    Сейчас компиляторы C++ камнями ка-ак закидают!
    ... << RSDN@Home 1.1.4 stable rev. 510>>
    Перегрузка == героин?
    От: Курилка Россия http://kirya.narod.ru/
    Дата: 06.08.05 16:56
    Оценка:
    Собственно хотелось бы обсудить вот эту статью — автор утверждает, что перегрузка (операторов/функций) увеличивает сложность программ и понижает их читаемость. Критикуются плюсы с их довольно обширными правилами приведения типов и пр.
    Re: Перегрузка == героин?
    От: VladGal  
    Дата: 07.08.05 14:53
    Оценка:
    Здравствуйте, Курилка, Вы писали:

    К>Собственно хотелось бы обсудить вот эту статью — автор утверждает, что перегрузка (операторов/функций) увеличивает сложность программ и понижает их читаемость. Критикуются плюсы с их довольно обширными правилами приведения типов и пр.

    Ага, а шаблоны (templates) — LSD 25. Всё это беспочвенные теоретические рассуждения, причём автор статьи похоже не знаком с вопросом
    ... << RSDN@Home 1.1.4 stable rev. 510>>
    Re[2]: Перегрузка == героин?
    От: StanislavK Великобритания  
    Дата: 08.08.05 07:16
    Оценка:
    Здравствуйте, adontz, Вы писали:

    >>>Overloading function names saves time during writing by saving keystrokes and, more significantly, saves the mental effort of thinking up unique names.


    A>Мда, а автор похоже сам сидит на героине! Оказывается перегрузка операторов нужна, чтобы экономить 2 символа и писать + вместо add


    Просвети, кстати, зачем, если не для этого?
    Re[3]: Перегрузка == героин?
    От: Oyster Украина https://github.com/devoyster
    Дата: 08.08.05 07:17
    Оценка:
    Здравствуйте, StanislavK, Вы писали:

    >>>>Overloading function names saves time during writing by saving keystrokes and, more significantly, saves the mental effort of thinking up unique names.


    A>>Мда, а автор похоже сам сидит на героине! Оказывается перегрузка операторов нужна, чтобы экономить 2 символа и писать + вместо add


    SK>Просвети, кстати, зачем, если не для этого?


    Для лучшего отражения той или иной метафоры в коде. Например, два комплексных числа логичней складывать как a + b, а не a.Add(b).
    Re[4]: Перегрузка == героин?
    От: Andrei N.Sobchuck Украина www.smalltalk.ru
    Дата: 08.08.05 07:27
    Оценка:
    Здравствуйте, Oyster, Вы писали:

    O>Здравствуйте, StanislavK, Вы писали:


    >>>>>Overloading function names saves time during writing by saving keystrokes and, more significantly, saves the mental effort of thinking up unique names.


    A>>>Мда, а автор похоже сам сидит на героине! Оказывается перегрузка операторов нужна, чтобы экономить 2 символа и писать + вместо add


    SK>>Просвети, кстати, зачем, если не для этого?


    O>Для лучшего отражения той или иной метафоры в коде. Например, два комплексных числа логичней складывать как a + b, а не a.Add(b).


    В критикуемой цитате об этом и говорится.
    ... << RSDN@Home 1.1.4 stable rev. 510>>
    Я ненавижу Hibernate
    Автор: Andrei N.Sobchuck
    Дата: 08.01.08
    !
    Re[2]: Перегрузка == героин?
    От: Курилка Россия http://kirya.narod.ru/
    Дата: 08.08.05 07:32
    Оценка:
    Здравствуйте, VladGal, Вы писали:

    VG>Ага, а шаблоны (templates) — LSD 25. Всё это беспочвенные теоретические рассуждения, причём автор статьи похоже не знаком с вопросом


    Факты?
    Re[5]: Перегрузка == героин?
    От: Oyster Украина https://github.com/devoyster
    Дата: 08.08.05 07:33
    Оценка:
    Здравствуйте, Andrei N.Sobchuck, Вы писали:

    >>>>>>Overloading function names saves time during writing by saving keystrokes and, more significantly, saves the mental effort of thinking up unique names.


    A>>>>Мда, а автор похоже сам сидит на героине! Оказывается перегрузка операторов нужна, чтобы экономить 2 символа и писать + вместо add


    SK>>>Просвети, кстати, зачем, если не для этого?


    O>>Для лучшего отражения той или иной метафоры в коде. Например, два комплексных числа логичней складывать как a + b, а не a.Add(b).


    ANS>В критикуемой цитате об этом и говорится.


    Хмм. Мне целые удобнее складывать как a + b...

    PS: За что минус: Re[3]: Перегрузка == героин?
    Автор: Oyster
    Дата: 08.08.05
    ?
    Re[7]: Перегрузка == героин?
    От: eao197 Беларусь http://eao197.blogspot.com
    Дата: 08.08.05 07:49
    Оценка:
    Здравствуйте, StanislavK, Вы писали:

    A>>>>>>Мда, а автор похоже сам сидит на героине! Оказывается перегрузка операторов нужна, чтобы экономить 2 символа и писать + вместо add


    SK>>>>>Просвети, кстати, зачем, если не для этого?


    O>>>>Для лучшего отражения той или иной метафоры в коде. Например, два комплексных числа логичней складывать как a + b, а не a.Add(b).


    SK>>>Напиши a.plus(b). Чем это хуже a + b никак понять не могу.


    E>>Тем, что ((a+b)/2 + c) лучше, чем a.plus(b).div(2).plus(c).


    SK>Для чисел — да, полность согласен и то это дело вкуса, метафоры тут не при чем.


    Нет, не вкуса, а общепринятой нотации. Выражать математические концепции проще математическими символами.

    SK>Но все остальное более логично выглядит как раз с функциями, а не с операторами.


    Так ведь здравого смысла еще никто не отменял. Если кто-то для класса Window определяет operator+=() для дополнения заголовка окна, то точно также он может объявить Window::add_string() для того же самого, хотя лучше было бы сделать caption() и set_caption().

    Кроме того, операторы, которые являются свободными функциями, а не членами класса, позволяют делать расширения. Например, если я реализую собственный класс My_Data и объявляю:
    std::ostream & operator<<( std::ostream & o, const My_Data & o ) { ... }

    то это дает мне возможность писать:
    std::cout << "My data: " << my_data << ", your data: " << your_data << std::endl;


    Если бы перегрузок оператора сдвига не было, мне бы пришлось делать что-то вроде:
    print( std::cout, "My data: " );
    print( std::cout, my_data );
    print( std::cout, ", your data: " );
    print( std::cout, your_data );
    print( std::cout, "\n", std::flush );

    или
    print( print( print( print( print( std::cout, "My data: " ), my_data ), ", your_data: " ), your_data ), "\n", std::flush );


    Вряд ли последние два варианта читабельнее и проще в сопровождении, чем первый с перегруженным оператором сдвига.
    ... << RSDN@Home 1.1.4 stable rev. 510>>


    SObjectizer: <микро>Агентно-ориентированное программирование на C++.
    Re[7]: Перегрузка == героин?
    От: Oyster Украина https://github.com/devoyster
    Дата: 08.08.05 08:32
    Оценка:
    Здравствуйте, Andrei N.Sobchuck, Вы писали:

    O>>PS: За что минус: Re[3]: Перегрузка == героин?
    Автор: Oyster
    Дата: 08.08.05
    ?


    ANS>Я согласен с тем
    Автор: Трурль
    Дата: 08.08.05
    , что конкатенация и сложение это разные вещи, и, соответсвенно, не согласен с тем, что это по сути одно и то же. Взять хотябы коммутативность.


    Понятно. Я говорил как программист, а не как математик. Как для программиста, для меня достаточно удобно и понятно писать "abc" + "def" вместо "abc".concat("def"). Это и означает "добавление одного значения к другому" для строки.

    И другую общепринятую интерпретацию "сложения" для строк мне припомнить тяжело.
    Re[5]: Перегрузка == героин?
    От: Oyster Украина https://github.com/devoyster
    Дата: 08.08.05 08:34
    Оценка:
    Здравствуйте, cranky, Вы писали:

    A>>>>Полная чушь! Суть как раз в том, что бы применять одно и тоже понятие к разным типам.


    Т>>>
    Т>>>1+2
    Т>>>"Hello "+ "world"
    Т>>>

    Т>>>Здесь "+" одно и то же понятие?

    O>>Да. Понятие сложения. Для чисел результат — сумма, для строк — конкатенация. Но метафорический смысл един

    C>Ну да.
    ("Hello world"-"world") ? "Hello "
    Или иначе: как отнимать строки, если сложение (в виде конкатенации) возможно?

    C>В случае соединения строк мне больше нравится введение нового оператора в язык, например, тильда в D.

    Меня не поняли
    Re[7]: Перегрузка == героин?
    Автор: Oyster
    Дата: 08.08.05


    O>>Но вот, например, "<<" в C++ и оператор побитового сдвига, и оператор вывода в поток — вот тут уже явно разные понятия.

    C>С++ вообще проектировался по принципу минимальных нововведений в синтаксис языка, отсюда и операторы в/в потоков, и обозначение ЧВФ, и некоторые другие вещи.

    И мабуть, это таки правильно. На C++ мне нравилось писать std::cout << 1 << " is not " << 2. Но я не спрашивал "почему", я писал "вот, смотрите, тут у них разный смысл".
    Re[4]: Перегрузка == героин?
    От: Трурль  
    Дата: 08.08.05 08:44
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>Вот если "Hello " + "world" будет заниматься побайтным сложением строк, или еще какую фигню делать, то это уже будет уродство.


    А каково "правильное" значение выражения
    (1 2 3) + (4 5 6)

    ?
    Есть по крайней мере 2 варианта
    a) (1 2 3 4 5 6)
    b) (5 7 9)
    Re[5]: Перегрузка == героин?
    От: Oyster Украина https://github.com/devoyster
    Дата: 08.08.05 08:46
    Оценка:
    Здравствуйте, Трурль, Вы писали:

    VD>>Вот если "Hello " + "world" будет заниматься побайтным сложением строк, или еще какую фигню делать, то это уже будет уродство.


    Т>А каково "правильное" значение выражения

    Т>
    Т>(1 2 3) + (4 5 6)
    Т>

    Т>?
    Т>Есть по крайней мере 2 варианта
    Т>
    Т>a) (1 2 3 4 5 6)
    Т>b) (5 7 9)
    Т>

    Есть общепринятая интерпретация для понятия "сложения" двух строк: Re[7]: Перегрузка == героин?
    Автор: Oyster
    Дата: 08.08.05
    Или я опять неправ?
    Re[8]: Перегрузка == героин?
    От: Трурль  
    Дата: 08.08.05 08:49
    Оценка:
    Здравствуйте, eao197, Вы писали:

    E>Если бы перегрузок оператора сдвига не было, мне бы пришлось делать что-то вроде:

    E>
    E>print( std::cout, "My data: " );
    E>print( std::cout, my_data );
    E>print( std::cout, ", your data: " );
    E>print( std::cout, your_data );
    E>print( std::cout, "\n", std::flush );
    E>

    E>или
    E>
    E>print( print( print( print( print( std::cout, "My data: " ), my_data ), ", your_data: " ), your_data ), "\n", std::flush );
    E>


    Могло быть и что-то вроде
    std::cout.print("My data: " ).print(my_data).print(", your data: ").print(your_data).nl.flush;
    Re[6]: Перегрузка == героин?
    От: Трурль  
    Дата: 08.08.05 08:52
    Оценка:
    Здравствуйте, Oyster, Вы писали:

    O>Есть общепринятая интерпретация для понятия "сложения" двух строк: Re[7]: Перегрузка == героин?
    Автор: Oyster
    Дата: 08.08.05
    Или я опять неправ?


    Но есть не менее общепринятая интерпретация для сложения двух векторов.
    Re[7]: Перегрузка == героин?
    От: Oyster Украина https://github.com/devoyster
    Дата: 08.08.05 08:59
    Оценка:
    Здравствуйте, Трурль, Вы писали:

    O>>Есть общепринятая интерпретация для понятия "сложения" двух строк: Re[7]: Перегрузка == героин?
    Автор: Oyster
    Дата: 08.08.05
    Или я опять неправ?


    Т>Но есть не менее общепринятая интерпретация для сложения двух векторов.


    Хмм... в C#, например, есть char[] и есть string. Второе также можно назвать "вектором символов", но уже с трудом (string уже как минимум read-only). Согласитесь, когда на таком уровне проводят разделительную черту между массивом символов и строкой, можно считать строку строкой, а не вектором, и переопределить для неё оператор +, поскольку для строки у этого оператора есть только один смысл.
    Re[5]: Перегрузка == героин?
    От: Кодёнок  
    Дата: 08.08.05 09:07
    Оценка:
    Здравствуйте, Трурль, Вы писали:

    VD>>Вот если "Hello " + "world" будет заниматься побайтным сложением строк, или еще какую фигню делать, то это уже будет уродство.


    Т>А каково "правильное" значение выражения

    Т>(1 2 3) + (4 5 6)
    Т>?
    Т>Есть по крайней мере 2 варианта
    Т>a) (1 2 3 4 5 6)
    Т>b) (5 7 9)

    Конкатенация и сложение два разных оператора. Другие языки специально для конкатенации используют не +.

    Возможно, для конкатенации лучше использовать & (and). Тогда (1 2 3) & (3 4 5) -> (1 2 3 3 4 5), а (1 2) + (3 3) -> (4 5).
    Re[4]: Перегрузка == героин?
    От: Трурль  
    Дата: 08.08.05 09:09
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>Согласись, что такой код:

    VD>
    VD>string mather = "мама";
    VD>string result = "Папа" + ' ' + mather + " я";
    VD>

    VD>Читается кда лучше чем:
    VD>
    VD>string mather = "мама";
    VD>string result = StrCat(StrCat(StrCat("Папа", ToString(' ')), mather), " я");
    VD>

    VD>

    Соглашусь. Но лично я предпочел бы вместо "+", нечто более оригинальное.
    Re[7]: Перегрузка == героин?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 08.08.05 09:21
    Оценка:
    Здравствуйте, StanislavK, Вы писали:

    SK>Но все остальное более логично выглядит как раз с функциями, а не с операторами.


    А чем отличаются другие вэлью-типы или строки?
    Size size1 = new Size(10, 20);
    Size size2 = new Size(5, 2);
    Size size3 = new Size(100, 0);
    size1 -= size2;
    Size size4 = size1 + size2 + size3;


    или
    DateTime yesterday = DateTime.Now;
    DateTime myBirthday = new DateTime(1974, 4, 25);
    TimeSpan age = yesterday - myBirthday;
    Console.WriteLine("Я живу: " + (age.Days / 365) + " год ("
        + age.Days + " дней).");
    
    DateTime dt2020 = new DateTime(2020, 1, 1);
    Console.WriteLine(dt2020 + " мне буедет " 
        + ((dt2020 - myBirthday).Days / 365));
    ... << RSDN@Home 1.2.0 alpha rev. 591>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[8]: Перегрузка == героин?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 08.08.05 09:21
    Оценка:
    Здравствуйте, eao197, Вы писали:

    E>Если бы перегрузок оператора сдвига не было, мне бы пришлось делать что-то вроде:

    E>
    E>print( std::cout, "My data: " );
    E>print( std::cout, my_data );
    E>print( std::cout, ", your data: " );
    E>print( std::cout, your_data );
    E>print( std::cout, "\n", std::flush );
    E>

    E>или
    E>
    E>print( print( print( print( print( std::cout, "My data: " ), my_data ), ", your_data: " ), your_data ), "\n", std::flush );
    E>


    Справидливости ради можно заметить, что потенциально можно сделать функцию с переменным числом полиморфных параметров Тогда код выглядел бы так:
    PrintLine("My data: ", my_data, ", your data: ", your_data);

    или так:
    Console.WriteLine("My data: {0}, your data: {1}", my_data, your_data);

    А в некоторых языках можно даже так:
    PrintLine("My data: {my_data}, your data: {your_data}");

    Откровенно говоря последний вариант мне нравится значитально больше остальных.
    ... << RSDN@Home 1.2.0 alpha rev. 591>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[6]: Перегрузка == героин?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 08.08.05 09:21
    Оценка:
    Здравствуйте, Oyster, Вы писали:

    O>PS: За что минус: Re[3]: Перегрузка == героин?
    Автор: Oyster
    Дата: 08.08.05
    ?


    Цитируй, плиз, то что действительно нужно.
    ... << RSDN@Home 1.2.0 alpha rev. 591>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[8]: Перегрузка == героин?
    От: cranky Украина  
    Дата: 08.08.05 09:23
    Оценка:
    Здравствуйте, Oyster, Вы писали:

    O>Здравствуйте, cranky, Вы писали:


    C>>Да всё понятно. Но таки конкатенация — никаким боком не сложение, даже в программировании. И, на мой взгляд, это неправильно, когда в стандартной библиотеке (хорошо, что не в самом языке) для строк применяется оператор+. Если нет более подходящего, тогда уж лучше функции concat или strcat. Ведь никто не будет с аналогичной целью вводить + для векторов?


    O>Да-да-да... но мне всё равно удобнее писать +


    O>Кстати, а почему нельзя перегрузить + для векторов? Вот, скажем, у меня мат. либа для операций над векторами и матрицами...


    Для цели поэлементного сложения аля сложения векторов — пожалуйста, да и то надо на всяк випадок проверить в справочнике по математике на совпадение последствий этого действия со смыслом сложения для скалярных типов. Но я имел в виду именно конкатенацию векторов, что вполне себе имеет право быть.

    O>>>>>Но вот, например, "<<" в C++ и оператор побитового сдвига, и оператор вывода в поток — вот тут уже явно разные понятия.

    C>>>>С++ вообще проектировался по принципу минимальных нововведений в синтаксис языка, отсюда и операторы в/в потоков, и обозначение ЧВФ, и некоторые другие вещи.

    O>>>И мабуть, это таки правильно. На C++ мне нравилось писать std::cout << 1 << " is not " << 2. Но я не спрашивал "почему", я писал "вот, смотрите, тут у них разный смысл".

    C>>Просто так, на всякий случай напомнить, почему так получилось...

    O>Ггы. Значит, << можно, а + нет? Нечестно!


    Случай битовых сдвигов не имеет столь древней истории применения в математике, как арифметических действий, поэтому возможности для перегрузки у них разные. Опять же, ИМХО.
    You aren't expected to absorb this
    Re[7]: Перегрузка == героин?
    От: Oyster Украина https://github.com/devoyster
    Дата: 08.08.05 09:36
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    Обычно я не оверквочу, но мне пришлось оставить самую первую фразу:

    >>>>>>Overloading function names saves time during writing by saving keystrokes and, more significantly, saves the mental effort of thinking up unique names.


    потому как в ней было словосочетание, на которое ссылался мой оппонент:

    ANS>В критикуемой цитате об этом и говорится.


    Все последующие фразы также не смог выбросить, т.к. без контекста диалог был бы непонятен. Поэтому никакого оверквотинга — всё легально
    Re[5]: Перегрузка == героин?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 08.08.05 11:03
    Оценка:
    Здравствуйте, Трурль, Вы писали:

    Т>Здравствуйте, VladD2, Вы писали:


    VD>>Вот если "Hello " + "world" будет заниматься побайтным сложением строк, или еще какую фигню делать, то это уже будет уродство.


    Т>А каково "правильное" значение выражения

    Т>
    Т>(1 2 3) + (4 5 6)
    Т>

    Т>?
    Т>Есть по крайней мере 2 варианта
    Т>
    Т>a) (1 2 3 4 5 6)
    Т>b) (5 7 9)
    Т>


    А (4 5 6) это на каком языке, и что означет?

    Мы вроде про строки говорили. У тебя есть сомнения по поводу того что делает приведенная тобой конструкция? Нет, ну, и не нужно высасывать проблему из пальца.
    ... << RSDN@Home 1.2.0 alpha rev. 591>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[7]: Перегрузка == героин?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 08.08.05 11:03
    Оценка:
    Здравствуйте, Трурль, Вы писали:

    Т>Но есть не менее общепринятая интерпретация для сложения двух векторов.


    А причем тут векторы?

    У тебя часм проблем с пониманием принципов ООП нет?
    ... << RSDN@Home 1.2.0 alpha rev. 591>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[5]: Перегрузка == героин?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 08.08.05 11:03
    Оценка:
    Здравствуйте, Трурль, Вы писали:

    Т>Соглашусь. Но лично я предпочел бы вместо "+", нечто более оригинальное.


    Не вижу чем здесь "+" хуже. Ну, в некоторых языках вообще "&" используют. Тоже особых проблем не возникает.
    ... << RSDN@Home 1.2.0 alpha rev. 591>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[10]: Перегрузка == героин?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 08.08.05 11:03
    Оценка:
    Здравствуйте, eao197, Вы писали:

    E>Справедливости ради можно добавить, что в зависимости от левого операнда оператора сдвига выполняемое действие может очень сильно меняться


    О, да. От смены функции тоже.
    ... << RSDN@Home 1.2.0 alpha rev. 591>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[9]: Перегрузка == героин?
    От: Oyster Украина https://github.com/devoyster
    Дата: 08.08.05 11:05
    Оценка:
    Уговорил
    Re[12]: Перегрузка == героин?
    От: Трурль  
    Дата: 08.08.05 12:38
    Оценка:
    Здравствуйте, eao197, Вы писали:

    E>А если функции помещения объекта куда-то именются по разному, то писать обобщенный код становится сложнее.


    По сути, все сводится к вопросу как лучше называть функции: print/serialize/calculate или do_something/do_something/do_something
    Re[11]: Перегрузка == героин?
    От: Oyster Украина https://github.com/devoyster
    Дата: 08.08.05 12:41
    Оценка:
    Здравствуйте, Andrei N.Sobchuck, Вы писали:

    O>>Согласен, но такая фича должна быть встроена в язык. Т.е. из тех операторов, что есть в C++ (C#), наилучший кандидат — именно +. И использовать его для конкатенации строк не есть зло.


    ANS>Я потому своё несогласие в виде минуса расписывать не стал, что это во многом не формализуемую ощущение правильности. Тебе кажется это правильно, мне — нет. А аргументов типа "вон там ракета бабахнула из-за исспользования + для конкатенации" у меня нет.


    Где-то так. Ветку можно закрыть

    ANS>И вообще, нечего тут сокращать, ибо для конкатенации множества строк всё равно прийдётся StringBuilder создавать.


    Это если у тебя есть StringBuilder (возвращаясь к C++)... Правда, и в C++ никто не будет делать тысячу конкатенаций (ибо опять же тормоза)...
    Re[12]: Перегрузка == героин?
    От: eao197 Беларусь http://eao197.blogspot.com
    Дата: 08.08.05 12:47
    Оценка:
    Здравствуйте, Oyster, Вы писали:

    ANS>>И вообще, нечего тут сокращать, ибо для конкатенации множества строк всё равно прийдётся StringBuilder создавать.


    O>Это если у тебя есть StringBuilder (возвращаясь к C++)...


    std::ostringstream?
    ... << RSDN@Home 1.1.4 stable rev. 510>>


    SObjectizer: <микро>Агентно-ориентированное программирование на C++.
    Re[13]: Перегрузка == героин?
    От: Oyster Украина https://github.com/devoyster
    Дата: 08.08.05 12:59
    Оценка:
    Здравствуйте, eao197, Вы писали:

    O>>Это если у тебя есть StringBuilder (возвращаясь к C++)...


    E>std::ostringstream?


    М.б. Позабывал всё напрочь
    Re[7]: Перегрузка == героин?
    От: Кодёнок  
    Дата: 08.08.05 13:39
    Оценка:
    Здравствуйте, ansi, Вы писали:

    Кё>>Конкатенация и сложение два разных оператора. Другие языки специально для конкатенации используют не +.

    Кё>>Возможно, для конкатенации лучше использовать & (and). Тогда (1 2 3) & (3 4 5) -> (1 2 3 3 4 5), а (1 2) + (3 3) -> (4 5).
    A>Побитовое И?

    Просто "И". Это у тебя привычка так о нем думать, потому что для целых оно побитовое.

    A>В ПХП, например, — это точка. Но точка там, насколько я помню, не используется для доступа к членам класса, поэтому вполне допустима с этой точки зрения. В Си++ я не вижу символа более подходящего, чем +.


    Это для строки. А для последовательности или матрицы появляется упомянутый Трурлем конфликт.

    Вообще давайте отличать значение символа от своих привычек Амперсанд, обозначает союз "и" (et), который почти всегда (кроме битовых и логических операций, которые суть одно и то же) обозначает соединение оригинальных объектов вместо, а вот за плюсом стоит создание нового объекта.

    Маша и Вася и Клава и Марина и Петя = (Маша Вася Клава Марина Петя)
    Маша + Вася + Клава + Марина + Петя = /* групповуха? */
    (1 2) & (3 4 5 6) = (1 2 3 4 5 6) // соединение
    (1 2) + (3 4 5) = ошибка
    (1 2) + (3 4) = (4 6) // векторная операция, сложение векторов. Есть еще матрицы. Символ "+" это математическое сложение, и применять его для конкатенации имхо плохая идея.

    Есть еще cons. Это почти то же, но образуется всегда список-пара:
    1 :: 2 = (1 2)
    (1 2) :: 3 = ((1 2) 3)
    (1 2) :: (3 4) = ((1 2) (3 4))

    Чем больше в языке операторов, которые можно перегрузить, тем он потенциально более выразителен. Понятие последовательности есть в любом языке (в С++ его ввели в STL, например), логично было бы ввести базовые операторы над списками. В современных программах побитовое "И" встречается редко, и вполне могло решаться функцией. Упомянутый Трурлем конфликт заключается всего лишь в недостатке выразительных средств языка, но никак не сойдет за аргумент против перегрузки "+".

    Возможность вводить новые типы (ПОЛНОПРАВНЫЕ с встроенными) тоже увеличивает выразительность, и перегрузка операций просто обязана сопутствовать этой возможности. Иначе они не будут полноправными Автор стати выдумал какие-то мифические проблемы.
    Re[11]: Перегрузка == героин?
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 08.08.05 13:43
    Оценка:
    Здравствуйте, Andrei N.Sobchuck, Вы писали:

    ANS>И вообще, нечего тут сокращать, ибо для конкатенации множества строк всё равно прийдётся StringBuilder создавать.


    Для того чтобы конкатекация была эффективной? Вовсе нет StringBuilder это излишество вызванное как раз неиспользованием перегрузки операторов.
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[12]: Перегрузка == героин?
    От: Oyster Украина https://github.com/devoyster
    Дата: 08.08.05 14:13
    Оценка:
    Здравствуйте, adontz, Вы писали:

    ANS>>И вообще, нечего тут сокращать, ибо для конкатенации множества строк всё равно прийдётся StringBuilder создавать.


    A>Для того чтобы конкатекация была эффективной? Вовсе нет StringBuilder это излишество вызванное как раз неиспользованием перегрузки операторов.


    Вы про C# StringBuilder? Это ж как надо перегружать, чтобы конкатенация через + была столь же эффективной (например, сборка строки в цикле)?
    Re[14]: Перегрузка == героин?
    От: Oyster Украина https://github.com/devoyster
    Дата: 08.08.05 14:23
    Оценка:
    Здравствуйте, adontz, Вы писали:

    O>>Вы про C# StringBuilder? Это ж как надо перегружать, чтобы конкатенация через + была столь же эффективной (например, сборка строки в цикле)?


    A>Надо просто отложить сборку до первого чтения строки


    Как вариант... но StringBuilder всё равно выходит функциональнее и [немного] эффективнее (надо же в таком случае внутри хранить некий список конкатенируемых строк, даже скорее дерево, — накладные расходы на это).

    А вообще идея хорошая
    Re[14]: Перегрузка == героин?
    От: Кодёнок  
    Дата: 08.08.05 14:25
    Оценка:
    Здравствуйте, adontz, Вы писали:

    O>>Вы про C# StringBuilder? Это ж как надо перегружать, чтобы конкатенация через + была столь же эффективной (например, сборка строки в цикле)?

    A>Надо просто отложить сборку до первого чтения строки

    А может вообще возвращать ленивую строку, которая будет имитировать обычную?
    Re[4]: Перегрузка == героин?
    От: Quintanar Россия  
    Дата: 08.08.05 14:37
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>Согласись, что такой код:

    VD>
    VD>string mather = "мама";
    VD>string result = "Папа" + ' ' + mather + " я";
    VD>

    VD>Читается кда лучше чем:
    VD>
    VD>string mather = "мама";
    VD>string result = StrCat(StrCat(StrCat("Папа", ToString(' ')), mather), " я");
    VD>

    VD>

    Не соглашусь. В данном конкретном случае есть некоторое удобство, однако в целом, это поощряет использование перегрузки для всего, что угодно, без всякой привязки к смыслу. Мне больше импонирует Haskell'овский подход. Там можно наложить ограничения на перегрузку для того, чтобы перегружаемые функции или операнды вели себя более предсказуемо.
    Re[12]: Перегрузка == героин?
    От: Andrei N.Sobchuck Украина www.smalltalk.ru
    Дата: 08.08.05 15:18
    Оценка:
    Здравствуйте, adontz, Вы писали:

    ANS>>И вообще, нечего тут сокращать, ибо для конкатенации множества строк всё равно прийдётся StringBuilder создавать.


    A>Для того чтобы конкатекация была эффективной? Вовсе нет StringBuilder это излишество вызванное как раз неиспользованием перегрузки операторов.


    Сомневаюсь, что даже использование перегрузки операторов поможет избавиться от этого излишиства.
    ... << RSDN@Home 1.1.4 stable rev. 510>>
    Я ненавижу Hibernate
    Автор: Andrei N.Sobchuck
    Дата: 08.01.08
    !
    Re[8]: Перегрузка == героин?
    От: cranky Украина  
    Дата: 08.08.05 15:19
    Оценка:
    Здравствуйте, Кодёнок, Вы писали:

    Кё>Есть еще cons. Это почти то же, но образуется всегда список-пара:

    Кё>1 :: 2 = (1 2)
    Кё>(1 2) :: 3 = ((1 2) 3)
    Кё>(1 2) :: (3 4) = ((1 2) (3 4))

    Интересный какой cons. А что это за язык? И возможна ли в нём не-двоичная нотация списков, типа такого: (1 2 3)?
    You aren't expected to absorb this
    Re[2]: Перегрузка == героин?
    От: A.Lokotkov Россия http://www.linkedin.com/pub/alexander-lokotkov/a/701/625
    Дата: 08.08.05 15:37
    Оценка:
    Здравствуйте, opossum, Вы писали:

    O>В приводимой статье вообще нет слова dispatch, а есть Heroin и drug,

    O>что выдает ее явно популистско-провокационный характер.

    Вы всё же статью-то почитайте.
    bloß it hudla
    Re[3]: Перегрузка == героин?
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 08.08.05 15:40
    Оценка:
    Здравствуйте, Quintanar, Вы писали:

    A>>Дальше даже читать не интересно. Видно, что автор не разбирается в вопросе

    Q>Не стоит брызгать слюной, поскольку критика справедлива. С++ вариант перегрузки не накладывает никаких ограничений _вообще_. Т.е. перегруженный оператор может делать, буквально, что угодно, и о никакой "общности понятий" речь идти не может.

    А Си++ вообще довольно много свободы даёт и требует мозгов чтобы этой свободой надлежащим образом распорядится. Например та же адресная арифметика. Кому эта свобода бьёт в голову, те на Си++ не пишите. Кто же заставляет?
    Почему-то мне не приходит в голову сопоставлять перегруженным операторам неочевидные понятия. Кому приходит, то и виноват!
    Тут есть два выхода: не писать на C# или научится правильно пользоваться перегрузкой. Кого на что хватает тот такой путь и выбирает
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[8]: Перегрузка == героин?
    От: cranky Украина  
    Дата: 08.08.05 15:41
    Оценка:
    Здравствуйте, Nose, Вы писали:

    N>Здравствуйте, cranky, Вы писали:


    C>>Да всё понятно. Но таки конкатенация — никаким боком не сложение, даже в программировании. И, на мой взгляд, это неправильно, когда в стандартной библиотеке (хорошо, что не в самом языке) для строк применяется оператор+. Если нет более подходящего, тогда уж лучше функции concat или strcat. Ведь никто не будет с аналогичной целью вводить + для векторов?


    N>Не сложение, конечно, если строго говорить. Но вот в сознании программиста -- вполне естественно "складывать" строки, не коряво звучит. Привычка?

    Наверно.
    N>Кроме того, типичное применение (псевдокод) :


    N>
    N>    strcat( string("Error ") , strcat( to_string(errNum) , strcat( string(" while proc...."), to_string( objNum ) ) ) );
    N>


    N>вместо 3-х знаков "+"... не страшно?


    Надо придумать, чтобы было так:
    strcat("Error",toString(errNum)," while proc....",toString(objNum))
    И ничем не хуже плюсов, и для плюсов вполне реально сделать.

    N>Идеологически правильный вариант грозит нечитаемым кодом...


    N>П.С. так и тянуло сказать "оверхед"
    You aren't expected to absorb this
    Re[9]: Перегрузка == героин?
    От: Nose Россия  
    Дата: 08.08.05 16:03
    Оценка:
    Здравствуйте, cranky, Вы писали:

    C>Надо придумать, чтобы было так:
    strcat("Error",toString(errNum)," while proc....",toString(objNum))
    И ничем не хуже плюсов, и для плюсов вполне реально сделать.


    Для плюсов тогда будет функция с переменным числом параметров. Операторы хотя бы безопасно можно сделать, а тут...
    Или написать 30 прототипов?

    не знаю, по-моему ничего страшного с "+", к тому же уже привычное старое решение...
    Никаких глюков, напрягов и пр. от него не знаю -- не встречался.
    Читаемо, удобно и стандартно.
    А теоретизирование насчет идеологии ни к чему не ведет.
    ... << RSDN@Home 1.1.4 beta 7 rev. 447>>
    Re[9]: Перегрузка == героин?
    От: cranky Украина  
    Дата: 08.08.05 16:09
    Оценка:
    Здравствуйте, Quintanar, Вы писали:

    Q>Здравствуйте, Nose, Вы писали:


    N>>
    N>>    strcat( string("Error ") , strcat( to_string(errNum) , strcat( string(" while proc...."), to_string( objNum ) ) ) );
    N>>


    N>>вместо 3-х знаков "+"... не страшно?

    N>>Идеологически правильный вариант грозит нечитаемым кодом...

    Q>Идеологически правильный вариант — выбрать другое обозначение для операции конкатенации. Ибо конкатенация по сути — это слияние списков, а не сложение.


    Ну это совсем идеалистический вариант — представление строки списком, всё-таки нечто с рандомным доступом подошло бы лучше.
    You aren't expected to absorb this
    Re[10]: Перегрузка == героин?
    От: cranky Украина  
    Дата: 08.08.05 16:21
    Оценка:
    Здравствуйте, Nose, Вы писали:

    N>Здравствуйте, cranky, Вы писали:


    C>>Надо придумать, чтобы было так:
    strcat("Error",toString(errNum)," while proc....",toString(objNum))
    И ничем не хуже плюсов, и для плюсов вполне реально сделать.


    N>Для плюсов тогда будет функция с переменным числом параметров. Операторы хотя бы безопасно можно сделать, а тут...

    N>Или написать 30 прототипов?

    Хм, вроде что-то у Александреску было насчёт списка типов. Может подойдёт для объявления функций с произвольным числом параметров?

    N>не знаю, по-моему ничего страшного с "+", к тому же уже привычное старое решение...

    N>Никаких глюков, напрягов и пр. от него не знаю -- не встречался.
    Также как и некоторые не встречались с memory leak.
    N>Читаемо, удобно и стандартно.
    Стандартно, конечно, только это единичный случай неправильного использования перегрузки и вообще, исключение из правил.
    N>А теоретизирование насчет идеологии ни к чему не ведет.
    You aren't expected to absorb this
    Re[3]: Перегрузка == героин?
    От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
    Дата: 08.08.05 16:58
    Оценка:
    Здравствуйте, Andrei N.Sobchuck, Вы писали:

    >>>>Overloading function names saves time during writing by saving keystrokes and, more significantly, saves the mental effort of thinking up unique names.

    A>>Мда, а автор похоже сам сидит на героине! Оказывается перегрузка операторов нужна, чтобы экономить 2 символа и писать + вместо add
    ANS>Эта. А для чего еще она нужна?

    Как минимум, она позволяет писать обобщённые конструкции, которые оперируют семантикой перекрываемых операторов. Нпаример, в STL часто пользуются перекрытием operator() для подмены функции функтором. Другой пример, перекрытие operator->() для smart-указателей.
    ... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
    Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
    P.S.: Винодельческие провинции — это есть рулез!
    Re[5]: Перегрузка == героин?
    От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
    Дата: 08.08.05 17:19
    Оценка:
    Здравствуйте, Quintanar, Вы писали:

    A>>А Си++ вообще довольно много свободы даёт и требует мозгов чтобы этой свободой надлежащим образом распорядится. Например та же адресная арифметика. Кому эта свобода бьёт в голову, те на Си++ не пишите. Кто же заставляет?


    [...]

    Q>Ну все, пошла обычная песня. Любители С++ уперлись в некую мнимую свободу С++ и в упор не видят, что есть и другие виды свободы. Например, свобода не думать об управлении памятью, свобода не думать, что означает данная закорючка в данном контексте, свобода не разбирать километровые объявления шаблонных типов и т.д.


    Слушай, давай уж обобщим до одного: "свобода не думать". Ну дык этаких "свободных разумов" хватает и без того. Прям девать некуда.

    Q>Полную свободу предоставляет, кстати, не С++, а С — на нем можно реализовать все, что угодно, без нелепых ограничений С++.

    Не. Ассемблер — вот выбор по-настоящему свободных людей!

    Q>Что вам приходит в голову, ведомо только вам одному. То, что вы считаете логичным и понятным, может оказаться совершенно нелогичным и непонятным для других.


    В точку.
    ... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
    Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
    P.S.: Винодельческие провинции — это есть рулез!
    Re[6]: Перегрузка == героин?
    От: Quintanar Россия  
    Дата: 08.08.05 17:43
    Оценка:
    Здравствуйте, Геннадий Васильев, Вы писали:

    Q>>Ну все, пошла обычная песня. Любители С++ уперлись в некую мнимую свободу С++ и в упор не видят, что есть и другие виды свободы. Например, свобода не думать об управлении памятью, свобода не думать, что означает данная закорючка в данном контексте, свобода не разбирать километровые объявления шаблонных типов и т.д.


    ГВ>Слушай, давай уж обобщим до одного: "свобода не думать". Ну дык этаких "свободных разумов" хватает и без того. Прям девать некуда.


    Это С++ так на вас влияет? Ведь ясно же, что имелась в виду свобода не думать о мелочах, а заняться более серьезными делами.

    Q>>Полную свободу предоставляет, кстати, не С++, а С — на нем можно реализовать все, что угодно, без нелепых ограничений С++.

    ГВ>Не. Ассемблер — вот выбор по-настоящему свободных людей!

    Ну, для таких серьезных как вы, наверное.
    Re[8]: Перегрузка == героин?
    От: Quintanar Россия  
    Дата: 08.08.05 18:02
    Оценка:
    Здравствуйте, adontz, Вы писали:

    A>Я активно пишу на Си++, C#, PHP и даже недавно на Паскале опять пришлось. Уж в чём в чём, а в том что я не знаю других языков обвинить меня точно нельзя. У Си++ есть недостатки, но перегрузка операторов не входит в их число.


    А по-моему, входит. Не перегрузка как таковая, а то, что перегружено может быть все, что угодно, без разбора.

    A>Я говорил о том, что F это обозначение силы, а m массы и для того чтобы читать чужие формулы не нужно осбо договариваться, нужно просто пользоваться общепринятыми обозначениями. Точно так же мне не придёт в голову для сложения двух чисел использовать %.


    Ну использовать + для "сложения" строк вам же приходит в голову, хотя конкатенация строк к сложению никакого отношения не имеет.

    A>А в праве не делать. Не хочется? Не делай! Если мне понадобится GC я всегда смогу его организовать и для Си++ или воспользоватся готовой реализацией(и кстати та что в .Net мягко говоря не лучшая). Зато мне никто GC не навязывает.


    Адаптированный к недружелюбному компилятору GC менее эффективен. А навязывает, не навязывает, разбирайтесь с апологетами .NET. Для императивного стиля GC менее необходим, нельзя не согласиться, хотя реализация продвинутых приемов типа continuations или closures без GC затруднительна.

    A>Зачем мне новый? В Си++ 10 унарных и 32 бинарных оператора которые можно перегрузить не считая () который может принимать любое количество аргументов. Я думаю, что из 43-х значков вполне можно выбрать тот, который по душе. А на большее просто ASCII символов не хватит.


    Ну а банальный foreach реализовать нельзя. Или таки можно в виде огромной груды шаблонов?
    Re[7]: Перегрузка == героин?
    От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
    Дата: 08.08.05 18:08
    Оценка:
    Здравствуйте, Quintanar, Вы писали:

    Q>Странно слышать это от сторонника языка, где нельзя даже создать новый оператор. С++ учиться и учиться гибкости у того же Lisp'a.


    А как ими пользоваться? Ну, создам я оператор '**' и автоматически потеряю возможность двойного разыменования указателя, например. Lisp требует все операторы разделять пробелами и Lisp-машине по барабану, какие символы использованы в определении "оператора". У C++ другая грамматика — отсюда и другие возможности по созданию операторов. Так что, претензия мимо кассы.

    С другой стороны, ASCII не хватит для того, чтобы передать всё богатство обозначений операторов, используемых в математике — для этого есть другие средства.
    ... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
    Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
    P.S.: Винодельческие провинции — это есть рулез!
    Re[8]: Перегрузка == героин?
    От: Quintanar Россия  
    Дата: 08.08.05 18:12
    Оценка:
    Здравствуйте, Геннадий Васильев, Вы писали:

    Q>>Странно слышать это от сторонника языка, где нельзя даже создать новый оператор. С++ учиться и учиться гибкости у того же Lisp'a.


    ГВ>А как ими пользоваться? Ну, создам я оператор '**' и автоматически потеряю возможность двойного разыменования указателя, например. Lisp требует все операторы разделять пробелами и Lisp-машине по барабану, какие символы использованы в определении "оператора". У C++ другая грамматика — отсюда и другие возможности по созданию операторов. Так что, претензия мимо кассы.


    Я имел ввиду операторы типа foreach и т.п.
    Re[9]: Перегрузка == героин?
    От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
    Дата: 08.08.05 18:15
    Оценка:
    Здравствуйте, Quintanar, Вы писали:

    A>>Я активно пишу на Си++, C#, PHP и даже недавно на Паскале опять пришлось. Уж в чём в чём, а в том что я не знаю других языков обвинить меня точно нельзя. У Си++ есть недостатки, но перегрузка операторов не входит в их число.

    Q>А по-моему, входит. Не перегрузка как таковая, а то, что перегружено может быть все, что угодно, без разбора.

    Это восходит к "проблеме дурака". Так от них везде проблемы! Есть такой хороший закон Мерфи: "Напишите программу, которой сможет пользоваться даже дурак и только дурак захочет ей пользоваться".

    На том же Lisp тоже можно наворотить "от души" — совершенно недуракоустойчивый язык. Ну и?

    [...]

    Q>Ну а банальный foreach реализовать нельзя. Или таки можно в виде огромной груды шаблонов?


    Какой конкретно foreach нужен? "Абстрактного" foreach не бывает.
    ... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
    Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
    P.S.: Винодельческие провинции — это есть рулез!
    Re[9]: Перегрузка == героин?
    От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
    Дата: 08.08.05 18:21
    Оценка:
    Здравствуйте, Quintanar, Вы писали:

    ГВ>>Дело-то как раз в том, что на плюсовиков (по моим наблюдениям) перечисленные мелочи не так уж сильно и влияют, если речь идёт о серьёзных делах. И "километровые объявления шаблонных типов" — не проблема, а естественное следствие самих шаблонов (не хочешь — не пользуй). И управление памятью — не проблема, а полезная фича. А закорючки... у любого языка свои закорючки. Даже у LISP.


    Q>Скажите честно, зачем вам управлять памятью?


    Нравится. Ага, именно так.

    Q> Вы пишете real time систему или игру, на худой конец? Ведь математик не изобретает каждый раз все с нуля, а использует имеющийся базис, чтобы идти вперед и не иметь дела с посторонними в общем-то вещами.


    Мне не мешает управление памятью. Наоборот — красивое решение содержит в себе элегантное управление памятью (вернее — жизненным циклом объектов, а не памятью как таковой) как неотъемлемую часть. И не надо сравнивать с математикой — любая формула из ВМ включает в себя элементарные операции сложения/умножения.

    Q> И так везде. Если сильно надо, можно откатиться назад и пересмотреть основы — написать свой GC, свою систему классов и т.п. Но как правило, это не нужно.


    Точно также, как мне редко нужен GC, если я пишу на C++.
    ... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
    Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
    P.S.: Винодельческие провинции — это есть рулез!
    Re[10]: Перегрузка == героин?
    От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
    Дата: 08.08.05 18:32
    Оценка:
    Здравствуйте, eao197, Вы писали:

    E>Здравствуйте, Трурль, Вы писали:


    Т>>Могло быть и что-то вроде

    Т>>
    Т>>std::cout.print("My data: " ).print(my_data).print(", your data: ").print(your_data).nl.flush;
    Т>>


    E>Как раз и нет. Ведь print -- это метод std::ofstream и как же мне добавить перегрузку метода print в класс std::ofstream для своего типа?


    Ну, для ofstream не получится, а вообще:

    
    class my_stream
    {
    
      public:
          template<typename T>
                my_stream &print(const T &rhs)
                {
                  ::print_to_stream(stream_, rhs); // Это - глобальная функция.
                }
        private:
            some_stream_type stream_;
    };


    Останется только специализировать ::print_to_stream дл своих типов.
    ... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
    Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
    P.S.: Винодельческие провинции — это есть рулез!
    Очапатка
    От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
    Дата: 08.08.05 18:34
    Оценка:
    Имелся ввиду такой код:

    
    class my_stream
    {
    
      public:
          template<typename T>
                my_stream &print(const T &rhs)
                {
                  ::print_to_stream(stream_, rhs); // Это - глобальная функция.
                    return *this;
                }
        private:
            some_stream_type stream_;
    };
    ... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
    Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
    P.S.: Винодельческие провинции — это есть рулез!
    Re[9]: Перегрузка == героин?
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 08.08.05 18:37
    Оценка:
    Здравствуйте, Quintanar, Вы писали:

    Q>А по-моему, входит. Не перегрузка как таковая, а то, что перегружено может быть все, что угодно, без разбора.

    Ну так это проблема "обезьяны с гранатой". Если ты не доверяешь человеку настолько, чтобы подпускать его к Си++ — не подпускай. си++ язык требующий высокого профессионального уровня. Именно требующий. Это не VB и "среднестатистический ламерок не разобрался" неуместный упрёк. Си++ и не расчитан на то, чтобы в нём кто попало разбирался. Язык мощный но вместе с тем и сложный.

    Q>Ну использовать + для "сложения" строк вам же приходит в голову, хотя конкатенация строк к сложению никакого отношения не имеет.


    Это общепринятое обозначение. Оно применяется не только для std::string но и для многих других строк и не только в Си++. То что + применяется для конкатекации это даже если и недостаток, то уж точно не Си++'овый.

    A>>Зачем мне новый? В Си++ 10 унарных и 32 бинарных оператора которые можно перегрузить не считая () который может принимать любое количество аргументов. Я думаю, что из 43-х значков вполне можно выбрать тот, который по душе. А на большее просто ASCII символов не хватит.


    Q>Ну а банальный foreach реализовать нельзя. Или таки можно в виде огромной груды шаблонов?


    А какая разница как что-то реализованно если использование всё равно одинаково? Давай тогдла отменим мусещк потому что у него длинные исходники. Мне как-то без разницы vector это встроенный тип или нет
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[9]: Перегрузка == героин?
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 08.08.05 18:38
    Оценка:
    Здравствуйте, Quintanar, Вы писали:

    Q>Скажите честно, зачем вам управлять памятью?


    Незачем. Стандартных new и delete обычно хватает, но если понадобится, то у меня будет такая возможность
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[11]: Перегрузка == героин?
    От: cranky Украина  
    Дата: 08.08.05 19:09
    Оценка:
    Здравствуйте, Quintanar, Вы писали:

    Q>Здравствуйте, cranky, Вы писали:


    Q>>>Идеологически правильный вариант — выбрать другое обозначение для операции конкатенации. Ибо конкатенация по сути — это слияние списков, а не сложение.


    C>> Ну это совсем идеалистический вариант — представление строки списком, всё-таки нечто с рандомным доступом подошло бы лучше.


    Хотя да, это тоже всего лишь косность мышления, последствия ненавистного императического программирования Списки оно, конечно, удобней для обобщённого функционального программирования.

    Q>Это не совсем идеалистический вариант, кое-где так и сделано. Кроме того, никто не говорит о том, что обязательно нужно представлять строку списком, речь идет о том, что конкатенация по сути — это слияние списков, а не арифметическре сложение, и логично для этого использовать другое обозначение.


    Тогда можно совсем обобщить: конкатенация — это операция слияния регулярных структур переменного размера. Есть возражения?
    You aren't expected to absorb this
    Re[12]: Перегрузка == героин?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 08.08.05 22:07
    Оценка:
    Здравствуйте, eao197, Вы писали:

    E>Влад, ты что, сейчас ответил, чтобы ответить?


    Я ответил, что думал.

    E>А если функции помещения объекта куда-то именются по разному, то писать обобщенный код становится сложнее.


    Я постоянно пользуюсь перегрузкой функций (правда обычно с олее разумными именами нежели "сдвиг") и проблем не испытывал.
    ... << RSDN@Home 1.2.0 alpha rev. 591>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[12]: Перегрузка == героин?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 08.08.05 22:07
    Оценка:
    Здравствуйте, adontz, Вы писали:

    A>Для того чтобы конкатекация была эффективной? Вовсе нет StringBuilder это излишество вызванное как раз неиспользованием перегрузки операторов.


    Причем тут перегрузка?
    ... << RSDN@Home 1.2.0 alpha rev. 591>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[13]: Перегрузка == героин?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 08.08.05 22:07
    Оценка:
    Здравствуйте, Oyster, Вы писали:

    O>Вы про C# StringBuilder? Это ж как надо перегружать, чтобы конкатенация через + была столь же эффективной (например, сборка строки в цикле)?


    Вообще то для строк сложение заменяется на вызов string.Concat() и string.Concat() эффективнее StringBuilder-а. Другое дело, что это все правильно для фиксированного количества строк. А вот если нужно в цикле по одной строчке канкотинировать, то StringBuilder рулит адназначна.
    ... << RSDN@Home 1.2.0 alpha rev. 591>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[14]: Перегрузка == героин?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 08.08.05 22:07
    Оценка:
    Здравствуйте, adontz, Вы писали:

    A>Надо просто отложить сборку до первого чтения строки


    Сборку? Может конкатинацию? Ну, и как ее отложиет не заводя промежуточное хранилище?
    А с промежуточным хранилицем будет не быстрее StringBuilder-а.
    ... << RSDN@Home 1.2.0 alpha rev. 591>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[16]: No String Builder
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 08.08.05 22:07
    Оценка:
    Здравствуйте, adontz, Вы писали:

    И какая разница со StringBuilder-ом?

    ЗЫ

    Шутку про "перенести в compile time" не понял.
    ... << RSDN@Home 1.2.0 alpha rev. 591>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[11]: Перегрузка == героин?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 08.08.05 22:07
    Оценка:
    Ну, аргументировать минус тоже не буду.
    ... << RSDN@Home 1.2.0 alpha rev. 591>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[10]: Перегрузка == героин?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 08.08.05 22:07
    Оценка:
    Здравствуйте, cranky, Вы писали:

    C> Ну это совсем идеалистический вариант — представление строки списком, всё-таки нечто с рандомным доступом подошло бы лучше.


    Эээ... Quintanar почитатель функциональных языков. А там массивы — это мовитон.
    ... << RSDN@Home 1.2.0 alpha rev. 591>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[15]: Перегрузка == героин?
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 08.08.05 22:18
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>Сборку? Может конкатинацию? Ну, и как ее отложиет не заводя промежуточное хранилище?

    VD>А с промежуточным хранилицем будет не быстрее StringBuilder-а.

    Да, только мы избавляемся от явного использования этого хранилища в большинстве случаев.
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[17]: No String Builder
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 08.08.05 22:25
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>И какая разница со StringBuilder-ом?


    По эффективности никакой. По способу использования — более прозрачно, менее заметно. Оптимизация конкатекации чаще подключается без явного использования.

    VD>Шутку про "перенести в compile time" не понял.


    Это не шутка Просто такие оптимизации доступны только Си++ шаблонам.

    Например есть выражение
    string x = a + b + c + d.


    при использовании StringBuilder или его аналога будет выделено место под два указателя (не будет уточнять smart/strong/weak это не важно) и туда запишутся &c и &d. Далее будет перераспределена память (массив из 2х элементов будет расширен до 3х) и туда допишется &b. И его ещё раз расширят для записи &a. Даже если перераспределения памяти не было (сразу выделили память под 10 указателе и хрен с ним) сдвиг элементов всё равно имел место быть.
    Так вот, я думаю, что заполнение этой таблицы указателей вполне может быть выполнено в compile-time. Мелочь, а приятно. Хотя конечно вряд ли овчинка стоит выделки и на длинных строках разницы не будет заметно.
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[12]: Перегрузка == героин?
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 09.08.05 03:02
    Оценка:
    Здравствуйте, eao197, Вы писали:

    E>Здравствуйте, VladD2, Вы писали:


    VD>>Здравствуйте, eao197, Вы писали:


    E>>>Справедливости ради можно добавить, что в зависимости от левого операнда оператора сдвига выполняемое действие может очень сильно меняться


    VD>>О, да. От смены функции тоже.


    E>Влад, ты что, сейчас ответил, чтобы ответить?

    E>Ведь если пытаться с помощь функций выражать операции помещения объекта в какой-то специфический поток, то желательно, чтобы функции имели осмысленные имена.
    Обычно для этого достаточно иметь осмысленное имя первого аргумента. Т.е. там, где в С++ мы пишем

    std::cout << "Hello" << " cruel " << "world";
    asnSerializer << "Hello" << " cruel " << "world";
    xml << "Hello" << " cruel " << "world";

    в языке без перегрузки << мы напишем
    Console.Write("Hello", " cruel ", "world");
    asnSerializer.Write("Hello", " cruel ", "world");
    xmlSerializer.Write("Hello", " cruel ", "world");

    И понятности нисколько не убавится. Перегрузка операторов хороша там, где
    а) применяются разнотипные параметры
    б) инфиксная нотация+приоритеты позволяет обойтись несколько более компактной записью

    Поясняю: Для Write мы сумели сделать функцию с произвольным количеством аргументов благодаря их однотипности.
    Если мы попробуем преобразовать какое-нибудь выражение векторной алгебры, то получится совсем другая тема. Вот, например:
    V1 = A*B*V;

    Здесь A — это матрица 3*4, B — матрица 4*2, V — это 2d вектор, V1 — 3d вектор. Вряд ли нам удастся придумать подходящую версию функции Multiply с произвольным количеством аргументов.
    Зато можно описать набор необходимых перегрузок двухаргументной функции Multiply. Но тогда придется выполнять преобразование в прямую польскую запись самостоятельно:
    V1 = Multiply(Multiply(A, B), V);
    Для более сложных выражений инфиксная нотация выиграет еще сильнее.
    ... << RSDN@Home 1.1.4 beta 5 rev. 395>>
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[9]: Перегрузка == героин?
    От: Кодёнок  
    Дата: 09.08.05 05:58
    Оценка:
    Здравствуйте, cranky, Вы писали:

    Кё>>Есть еще cons. Это почти то же, но образуется всегда список-пара:

    Кё>>1 :: 2 = (1 2)
    Кё>>(1 2) :: 3 = ((1 2) 3)
    Кё>>(1 2) :: (3 4) = ((1 2) (3 4))

    C>Интересный какой cons. А что это за язык? И возможна ли в нём не-двоичная нотация списков, типа такого: (1 2 3)?


    Не помню, по-моему Erlang. А списки *теоретически* всегда представляются как пары (на самом деле они часто реализованы напрямую, тем не менее суть операций car и cdr — именно работа с парой).

    Т.е. (1 2 3 4) это (cons 1 (cons 2 (cons 3 (cons 4 ())))), поэтому car — первый элемент пары будет 1, cdr — второй элемент, будет списком.
    Re[8]: Перегрузка == героин?
    От: StanislavK Великобритания  
    Дата: 09.08.05 06:31
    Оценка:
    Здравствуйте, eao197, Вы писали:

    SK>>Для чисел — да, полность согласен и то это дело вкуса, метафоры тут не при чем.

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

    SK>>Но все остальное более логично выглядит как раз с функциями, а не с операторами.

    E>Так ведь здравого смысла еще никто не отменял. Если кто-то для класса Window определяет operator+=() для дополнения заголовка окна, то точно также он может объявить Window::add_string() для того же самого, хотя лучше было бы сделать caption() и set_caption().

    Вот о том и речь — оипользование перегрузки оперторов где-то еще, кроме чисел приводит, на мой, субъективный взгляд, к недопониманию, их не надо больше нигде перегражать. Есть исключение — + для строк, это удобно, но совсем не обязательно, код не будет менее читабельным при его отсутсвии, если не постараться, конечно, как делают многие в этой ветке

    E>Кроме того, операторы, которые являются свободными функциями, а не членами класса, позволяют делать расширения. Например, если я реализую собственный класс My_Data и объявляю:

    E>
    E>std::ostream & operator<<( std::ostream & o, const My_Data & o ) { ... }
    E>

    E>то это дает мне возможность писать:
    E>
    E>std::cout << "My data: " << my_data << ", your data: " << your_data << std::endl;
    E>

    E>Если бы перегрузок оператора сдвига не было, мне бы пришлось делать что-то вроде:
    E>
    E>print( std::cout, "My data: " );
    E>print( std::cout, my_data );
    E>print( std::cout, ", your data: " );
    E>print( std::cout, your_data );
    E>print( std::cout, "\n", std::flush );
    E>

    E>или
    E>
    E>print( print( print( print( print( std::cout, "My data: " ), my_data ), ", your_data: " ), your_data ), "\n", std::flush );
    E>


    E>Вряд ли последние два варианта читабельнее и проще в сопровождении, чем первый с перегруженным оператором сдвига.


    Второй — ничуть не хуже, только строчек больше, что я злом не считаю. Думаю, что новичку или человеку, который С++ знает плохо, второй даже будет более понятен, а знающему человеку — побоку. Первый, конечно, чисто эстетичнее красивее, но не более.
    Последний это ужас, но и с операторами можно легко что-нить страшное изобразить.
    Re[4]: Перегрузка == героин?
    От: StanislavK Великобритания  
    Дата: 09.08.05 06:33
    Оценка:
    Здравствуйте, adontz, Вы писали:

    A>Здравствуйте, StanislavK, Вы писали:


    SK>>Просвети, кстати, зачем, если не для этого?

    A>Единообразием использования встроенного и пользовательского типов. Ты же пишешь (3+4)/5 а не 3.add(4).div(5).
    Я и так это могу написать, без перегрузки операторов

    A>Например если в шаблонный класс для подсчёта корней уравнения вместо double подставить какой-нибудь класс для вычислений с повышенной точностью вместо double, то код шаблонного класса не надо будет менять.

    Согласен, для чисел это полезно, но в общем, не нужная фича.
    Re[6]: Перегрузка == героин?
    От: StanislavK Великобритания  
    Дата: 09.08.05 06:58
    Оценка:
    Здравствуйте, Oyster, Вы писали:

    O>Здравствуйте, StanislavK, Вы писали:


    A>>>Например если в шаблонный класс для подсчёта корней уравнения вместо double подставить какой-нибудь класс для вычислений с повышенной точностью вместо double, то код шаблонного класса не надо будет менять.

    SK>>Согласен, для чисел это полезно, но в общем, не нужная фича.

    O>Согласен, для ходьбы ноги полезны, но в общем ненужная фича


    Убедил, против твоих аргументов ничего не прокатит.
    Re[7]: Перегрузка == героин?
    От: Andrei N.Sobchuck Украина www.smalltalk.ru
    Дата: 09.08.05 07:01
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>И для них использование "+" как оператора конкатинации совершенно нормально и общепринято. В том же SQL-е это сплошь и рядом.

    # select 'qwe' || 'rty';
     ?column?
    ----------
     qwerty
    ... << RSDN@Home 1.1.4 stable rev. 510>>
    Я ненавижу Hibernate
    Автор: Andrei N.Sobchuck
    Дата: 08.01.08
    !
    Re[11]: Перегрузка == героин?
    От: Nose Россия  
    Дата: 09.08.05 07:14
    Оценка:
    Здравствуйте, cranky, Вы писали:

    C>Здравствуйте, Nose, Вы писали:


    N>>Здравствуйте, cranky, Вы писали:


    C>Хм, вроде что-то у Александреску было насчёт списка типов. Может подойдёт для объявления функций с произвольным числом параметров?

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

    N>>не знаю, по-моему ничего страшного с "+", к тому же уже привычное старое решение...

    N>>Никаких глюков, напрягов и пр. от него не знаю -- не встречался.
    C>Также как и некоторые не встречались с memory leak.

    Ты встречался? расскажи
    А последний мемори лик я видел уже больше года назад

    N>>Читаемо, удобно и стандартно.

    C>Стандартно, конечно, только это единичный случай неправильного использования перегрузки и вообще, исключение из правил.

    Поезд уже ушел.
    ... << RSDN@Home 1.1.4 beta 7 rev. 447>>
    Re[8]: Перегрузка == героин?
    От: Курилка Россия http://kirya.narod.ru/
    Дата: 09.08.05 07:40
    Оценка:
    Здравствуйте, adontz, Вы писали:

    A>Здравствуйте, Quintanar, Вы писали:


    Q>>Вопреки сложившемуся мнению, программы можно писать вообще без ООП, хотя это, конечно, требует несколько большего интеллекта.


    A>Угу. На ассемблере. И перегрузки операторов там нету


    Если для Вас в программировании есть только ООП языки и ассемблер, то мне грустно за Вас
    Re[8]: Перегрузка == героин?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 09.08.05 08:21
    Оценка:
    Здравствуйте, Andrei N.Sobchuck, Вы писали:

    ANS>Здравствуйте, VladD2, Вы писали:


    VD>>И для них использование "+" как оператора конкатинации совершенно нормально и общепринято. В том же SQL-е это сплошь и рядом.

    ANS>
    ANS># select 'qwe' || 'rty';
    ANS> ?column?
    ANS>----------
    ANS> qwerty
    ANS>


    1. Погляди MS SqlServer.
    2. || — это во многих языках "логическое или". Ну, и чем лучше для конкатинации использовать или вместо плюса?
    ... << RSDN@Home 1.2.0 alpha rev. 591>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[18]: No String Builder
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 09.08.05 08:21
    Оценка:
    Здравствуйте, adontz, Вы писали:

    A>По эффективности никакой. По способу использования — более прозрачно, менее заметно. Оптимизация конкатекации чаще подключается без явного использования.


    Ну, и зачем что-то неявное через ухо когда можно просто взять класс заточенный под конкретную задачу?

    Я видил много С++-ного кода. И в болшинстве случаев никто даже не задумывался над тем, что конкатинация может быть тормозом.

    A>Это не шутка Просто такие оптимизации доступны только Си++ шаблонам.


    A>Например есть выражение

    A>
    A>string x = a + b + c + d.
    A>


    Я тебе уже третий раз повторяю, что в Шапре подобный код выливается в вызов функции string.Concat(). А эффективнее нее уже ничего не найти.

    Вдумки поскипаны.
    ... << RSDN@Home 1.2.0 alpha rev. 591>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[16]: Перегрузка == героин?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 09.08.05 08:21
    Оценка:
    Здравствуйте, adontz, Вы писали:

    A>Да, только мы избавляемся от явного использования этого хранилища в большинстве случаев.


    Осталось только выяснить зачем это делать. Мысли лучше выражать явно.
    ... << RSDN@Home 1.2.0 alpha rev. 591>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[10]: Перегрузка == героин?
    От: cranky Украина  
    Дата: 09.08.05 08:22
    Оценка:
    Здравствуйте, Кодёнок, Вы писали:

    Кё>Здравствуйте, cranky, Вы писали:


    Кё>>>Есть еще cons. Это почти то же, но образуется всегда список-пара:

    Кё>>>1 :: 2 = (1 2)
    Кё>>>(1 2) :: 3 = ((1 2) 3)
    Кё>>>(1 2) :: (3 4) = ((1 2) (3 4))

    C>>Интересный какой cons. А что это за язык? И возможна ли в нём не-двоичная нотация списков, типа такого: (1 2 3)?


    Кё>Не помню, по-моему Erlang. А списки *теоретически* всегда представляются как пары (на самом деле они часто реализованы напрямую, тем не менее суть операций car и cdr — именно работа с парой).


    Это так, просто в лиспе (cons 1 2) == '(1 . 2), т.е. получаем точечный список (пару в данном случае), в кудре последнего конса которого будет не указатель на след. конс, как в нормальном списке, а атом. Оттого меня и заинтересовало, как в языке, в котором результат конса представляется как простой список аргументов, записываются обычные списки переменного размера.

    Кё>Т.е. (1 2 3 4) это (cons 1 (cons 2 (cons 3 (cons 4 ())))), поэтому car — первый элемент пары будет 1, cdr — второй элемент, будет списком.


    Это верно для лиспа.
    You aren't expected to absorb this
    Re[17]: Перегрузка == героин?
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 09.08.05 08:36
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    A>>Да, только мы избавляемся от явного использования этого хранилища в большинстве случаев.

    VD>Осталось только выяснить зачем это делать. Мысли лучше выражать явно.

    Явно лучше выражать неочевидные мысли. Ты же не пишешь
    // А здесь мы увеличивает значение счётчика на единицу
    i++


    Как ты сам признался об оптимизации конкатекация думают мало. Так лучше предложить оптимизацию которая будет неявно подключатся, чем заставлять людей думать.
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[9]: Перегрузка == героин?
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 09.08.05 08:38
    Оценка:
    Здравствуйте, Курилка, Вы писали:

    A>>Угу. На ассемблере. И перегрузки операторов там нету

    К>Если для Вас в программировании есть только ООП языки и ассемблер, то мне грустно за Вас

    Ага. Забавно. Ну давай — перечисли тогда языки которые позволяют расширить сознание как у тебя
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[20]: No String Builder
    От: Lloyd Россия  
    Дата: 09.08.05 08:44
    Оценка:
    Здравствуйте, adontz, Вы писали:

    VD>>Я тебе уже третий раз повторяю, что в Шапре подобный код выливается в вызов функции string.Concat(). А эффективнее нее уже ничего не найти.


    A>Влад, учи матчасть a.Concat(b.Concat(c.Concat(d))) это мягко говоря не самый эффективный код.


    Ну ты все-таки посмотри во что выливается string x = a + b + c + d, а не начинай сразу хохмить.
    string x = string.Concat(a, b, c, d);

    Приведешь более эффективный вариант?
    ... << RSDN@Home 1.1.4 stable rev. 510>>
    Re[22]: No String Builder
    От: Oyster Украина https://github.com/devoyster
    Дата: 09.08.05 08:47
    Оценка:
    Здравствуйте, adontz, Вы писали:

    O>>??? Оно преобразуется в System.String.Concat(a, b, c, d) , так что непонятно, о чём вы.


    A>Да ну? Я между прочим не наобум сказал, а сгенерированный код поглядел


    Код:

    using System;
    
    namespace ConsoleApplication100
    {
        class Class1
        {
            [STAThread]
            static void Main(string[] args)
            {
                string a = "a";
                string b = "b";
                string c = "c";
                string d = "d";
                string e = a + b + c + d;
            }
        }
    }

    IL:

    .method private hidebysig static void Main(string[] args) cil managed
    {
          .custom instance void [mscorlib]System.STAThreadAttribute::.ctor()
          .entrypoint
          // Code Size: 35 byte(s)
          .maxstack 4
          .locals (
                string text1,
                string text2,
                string text3,
                string text4)
          L_0000: ldstr "a"
          L_0005: stloc.0 
          L_0006: ldstr "b"
          L_000b: stloc.1 
          L_000c: ldstr "c"
          L_0011: stloc.2 
          L_0012: ldstr "d"
          L_0017: stloc.3 
          L_0018: ldloc.0 
          L_0019: ldloc.1 
          L_001a: ldloc.2 
          L_001b: ldloc.3 
          L_001c: call string string::Concat(string, string, string, string)
          L_0021: pop 
          L_0022: ret 
    }
    Re[10]: Перегрузка == героин?
    От: Курилка Россия http://kirya.narod.ru/
    Дата: 09.08.05 08:51
    Оценка:
    Здравствуйте, adontz, Вы писали:

    A>Здравствуйте, Курилка, Вы писали:


    A>>>Угу. На ассемблере. И перегрузки операторов там нету

    К>>Если для Вас в программировании есть только ООП языки и ассемблер, то мне грустно за Вас

    A>Ага. Забавно. Ну давай — перечисли тогда языки которые позволяют расширить сознание как у тебя


    Не уместная ирония на мой взгляд
    Просто замыкаться на чём-то имхо есть не лучший способ получения знаний. Тот же Vlad2 хоть и не очень любит ФП, но признаёт что там есть определённое число идей вполне полезных для применения, которые перекочёвывают во многие популярные языки.
    Кстати те же плюсы (которыми ты вроде бы не брезгуешь) всё дальше и дальше отходят от ООП, тот же Александреску это в своей книжке продемонстрировал (хоть и не совсем чтобы большими буквами ).
    И умение специалиста в программировании прежде всего должно состоять в том, чтобы он знал не какуют-то только одну пардигму (ООП в данном случае), а имел целый набор и применял их по мере надобности. Кстати, а шаблоны ты не применяешь?
    Перечислять языки не стану — расширение твоего сознания это прежде всего твоя задача (если она у тебя есть, конечно).
    Re[23]: No String Builder
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 09.08.05 08:52
    Оценка:
    Здравствуйте, Oyster, Вы писали:

    O>>>??? Оно преобразуется в System.String.Concat(a, b, c, d) , так что непонятно, о чём вы.

    A>>Да ну? Я между прочим не наобум сказал, а сгенерированный код поглядел
    O>Код:

    ОК, может быть для .Net я погорячился. Но в Си++ таких оптимизаций точно нет
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[11]: Перегрузка == героин?
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 09.08.05 08:54
    Оценка:
    Здравствуйте, Курилка, Вы писали:

    К>Не уместная ирония на мой взгляд


    Я и на Си++ пишу и шаблоны использую. Ну и? К чему была фраза "Если для Вас в программировании есть только ООП языки и ассемблер, то мне грустно за Вас"? Тогда открой её истинный смысл.
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[9]: Перегрузка == героин?
    От: Andrei N.Sobchuck Украина www.smalltalk.ru
    Дата: 09.08.05 09:00
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>1. Погляди MS SqlServer.


    Так и нужно было писать не "В том же SQL-е это сплошь и рядом.", а "В том же MS SQL Server-е это сплошь и рядом."
    ... << RSDN@Home 1.1.4 stable rev. 510>>
    Я ненавижу Hibernate
    Автор: Andrei N.Sobchuck
    Дата: 08.01.08
    !
    Re[11]: Перегрузка == героин?
    От: Курилка Россия http://kirya.narod.ru/
    Дата: 09.08.05 09:01
    Оценка:
    Здравствуйте, adontz, Вы писали:

    A>Здравствуйте, Курилка, Вы писали:


    К>>+

    К>>Как сказал Хоар: Premature optimization is the root of all evil.

    A>-1 за знание предмета.


    A>Во-первых, это сказал Робет Флойд. Во-вторых это толкьо часть цитаты. А вот полностью

    A>"We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil."
    A>его высказывание имеет совсем другой смысл.
    Какой?

    Факты без подтверждения не принимаются, -1

    http://www.cookcomputing.com/blog/archives/000084.html
    (цитата совпадает с твоей, но Флойдом там не пахнет)
    http://encyclopedia.thefreedictionary.com/Premature%20optimization
    http://en.wikipedia.org/wiki/Premature_optimization
    http://www.answers.com/topic/optimization-computer-science

    твои факты?
    Re[12]: Перегрузка == героин?
    От: Курилка Россия http://kirya.narod.ru/
    Дата: 09.08.05 09:04
    Оценка:
    Здравствуйте, adontz, Вы писали:

    A>Здравствуйте, Курилка, Вы писали:


    К>>Не уместная ирония на мой взгляд


    A>Я и на Си++ пишу и шаблоны использую. Ну и? К чему была фраза "Если для Вас в программировании есть только ООП языки и ассемблер, то мне грустно за Вас"? Тогда открой её истинный смысл.


    Qui habet aures audiendi, audiat
    Смысл ровно такой, какой там написан
    Re[13]: Перегрузка == героин?
    От: Курилка Россия http://kirya.narod.ru/
    Дата: 09.08.05 09:25
    Оценка:
    Здравствуйте, adontz, Вы писали:

    A>Здравствуйте, Курилка, Вы писали:


    К>>http://www.cookcomputing.com/blog/archives/000084.html

    К>>(цитата совпадает с твоей, но Флойдом там не пахнет)

    A>Во-первых, http://www.cis.ksu.edu/~edwin/

    A>Во-вторых, http://www.rsdn.ru/Forum/Message.aspx?mid=1279271&amp;only=1
    Автор: adontz
    Дата: 19.07.05

    Не густо, всего 1 ссылка на какого-то студента...
    A>В-третьих, какая разница кто сказал?
    В принципе без разницы, ты минусы ставить начал, не я...
    Соответственно тебе видней должно быть.

    A>Суть в том, что кусок фразы вырванный из контекста стал автортетным оправданием отсутсвия оптимизации.

    Суть в том, что многие адепты плюсов (и не только) сразу бегут в сторону оптимизации, не обращая внимания, что клиента в первую очередь интересует решение их бизнес-задач, а не оптимальность сборщика мусора и т.п., пока эти ньюансы не сказываются на работоспособности приложения.
    P.S. Ничего не имею ни против плюсов, ни против шарпа, ни против любого другого языка (за искл., может быть, Оберона, СГ тут постарался просто ) просто уже наели оскомину одни и те же аргументы и той и другой стороны, когда надо в первую очередь решать задачи, а не меряться разными частями тела...
    Re[14]: Перегрузка == героин?
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 09.08.05 09:30
    Оценка:
    Здравствуйте, Курилка, Вы писали:

    К>Не густо, всего 1 ссылка на какого-то студента...


    Вообще-то о полном варианте фразы я впервые узнал из книжки, а не из Интернета

    A>>В-третьих, какая разница кто сказал?

    К>В принципе без разницы, ты минусы ставить начал, не я...

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

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


    Это проблема слабозарактерность Project Manager, а не программистов. В серьёзном проекте угробить половину времени на распределение памяти "потому что мне кажется, что онон может тормозить и вообще стандартная реализация Г" просто никто не даст, как бы того ни хотелось.
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[10]: Перегрузка == героин?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 09.08.05 11:00
    Оценка:
    Здравствуйте, Andrei N.Sobchuck, Вы писали:

    ANS>Так и нужно было писать не "В том же SQL-е это сплошь и рядом.", а "В том же MS SQL Server-е это сплошь и рядом."


    Это не единственный сервер. Просто про него я точно помню.
    ... << RSDN@Home 1.2.0 alpha rev. 591>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[18]: Перегрузка == героин?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 09.08.05 11:00
    Оценка:
    Здравствуйте, adontz, Вы писали:

    A>Явно лучше выражать неочевидные мысли. Ты же не пишешь

    A>
    A>// А здесь мы увеличивает значение счётчика на единицу
    A>i++
    A>


    Упражняться в свовоблудии у меня желания нет.
    ... << RSDN@Home 1.2.0 alpha rev. 591>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[23]: No String Builder
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 09.08.05 11:27
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>Врешь.


    Мда. Приехали
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[24]: No String Builder
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 09.08.05 11:36
    Оценка:
    Здравствуйте, adontz, Вы писали:

    VD>>Врешь.


    A>Мда. Приехали


    Называю вещи своими именми. Ничего ты не смотрел. Иначе бы на стал писать столь откровнную ерунду.
    ... << RSDN@Home 1.2.0 alpha rev. 591>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[24]: No String Builder
    От: Oyster Украина https://github.com/devoyster
    Дата: 09.08.05 11:37
    Оценка:
    Здравствуйте, adontz, Вы писали:

    VD>>Врешь.


    A>Мда. Приехали


    Почему это? Ты же говорил, что смотрел сгенерированный код, верно? Я давал пример, опровергавший твоё утверждение: Re[22]: No String Builder
    Автор: Oyster
    Дата: 09.08.05
    . Ну и кто тут неправ?
    Re[25]: No String Builder
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 09.08.05 12:26
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>>>Врешь.

    A>>Мда. Приехали
    VD>Называю вещи своими именми. Ничего ты не смотрел. Иначе бы на стал писать столь откровнную ерунду.

    Если уж на то пошло откровенная ерунда это то, что говоришь Выдрал какой-то куцый пример и обрадовался.
    Складывать строки когда они так навиду не велика заслуга. Что-то я в более жизненных случаях никаких оптимизаций от компилятора не заметил. Так что я не понял что ты пытаешься доказать? Что компилятор в искуственно упрощённом коде может что-то оптимизировать? Ура!
    using System;
    
    namespace cstest
    {
        class CSTest
        {
            static string SomeFuncReturningString()
            {
                return "qwerty";
            }
            
            [STAThread]
            static void Main(string [] args)
            {
                string a = "aaa";
                string b = "bbb";
                string c = "ccc";
                string d = "ddd";
                
                string e = SomeFuncReturningString() + SomeFuncReturningString() + SomeFuncReturningString() + SomeFuncReturningString();
            }
        }
    }
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[26]: No String Builder
    От: Oyster Украина https://github.com/devoyster
    Дата: 09.08.05 12:32
    Оценка:
    Здравствуйте, adontz, Вы писали:

    A>Если уж на то пошло откровенная ерунда это то, что говоришь Выдрал какой-то куцый пример и обрадовался.

    A>Складывать строки когда они так навиду не велика заслуга. Что-то я в более жизненных случаях никаких оптимизаций от компилятора не заметил. Так что я не понял что ты пытаешься доказать? Что компилятор в искуственно упрощённом коде может что-то оптимизировать? Ура!

    [... code skipped ...]

    Результат компиляции твоего кода в Release (IL):

    .method private hidebysig static void Main(string[] args) cil managed
    {
        .custom instance void [mscorlib]System.STAThreadAttribute::.ctor()
        .entrypoint
        // Code Size: 27 byte(s)
        .maxstack 4
        L_0000: call string cstest.CSTest::SomeFuncReturningString()
        L_0005: call string cstest.CSTest::SomeFuncReturningString()
        L_000a: call string cstest.CSTest::SomeFuncReturningString()
        L_000f: call string cstest.CSTest::SomeFuncReturningString()
        L_0014: call string string::Concat(string, string, string, string)
        L_0019: pop 
        L_001a: ret 
    }

    So what the heck? Или ты что-то другое пытался доказать?
    Re[27]: PS
    От: Oyster Украина https://github.com/devoyster
    Дата: 09.08.05 12:39
    Оценка:
    Здравствуйте, Oyster, Вы писали:

    Надеюсь, ты не думал, что компилятор догадается о детерминированности функции SomeFuncReturningString() — это всё-таки довольно круто. Кстати, этим может заняться и рантайм.

    В любом случае, к вопросу конкатенации строк это отношения не имеет
    Re[27]: No String Builder
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 09.08.05 12:41
    Оценка:
    Здравствуйте, Oyster, Вы писали:

    O>Результат компиляции твоего кода в Release (IL):


    O>
    O>.method private hidebysig static void Main(string[] args) cil managed
    O>{
    O>    .custom instance void [mscorlib]System.STAThreadAttribute::.ctor()
    O>    .entrypoint
    O>    // Code Size: 27 byte(s)
    O>    .maxstack 4
    O>    L_0000: call string cstest.CSTest::SomeFuncReturningString()
    O>    L_0005: call string cstest.CSTest::SomeFuncReturningString()
    O>    L_000a: call string cstest.CSTest::SomeFuncReturningString()
    O>    L_000f: call string cstest.CSTest::SomeFuncReturningString()
    O>    L_0014: call string string::Concat(string, string, string, string)
    O>    L_0019: pop 
    O>    L_001a: ret 
    O>}
    O>

    O>So what the heck? Или ты что-то другое пытался доказать?

    А чем ты IL смотришь? Просто лично я гляжу ассемблерный код EXE'шника.
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[14]: Перегрузка == героин?
    От: Andrei N.Sobchuck Украина www.smalltalk.ru
    Дата: 09.08.05 12:45
    Оценка:
    Здравствуйте, adontz, Вы писали:

    A>>>Для того чтобы конкатекация была эффективной? Вовсе нет StringBuilder это излишество вызванное как раз неиспользованием перегрузки операторов.

    ANS>>Сомневаюсь, что даже использование перегрузки операторов поможет избавиться от этого излишиства.

    A>Сомневаться не надо, я сам написал строковый класс на C++, который кроме всего прочьего оптимизировал конкатекацию без вмешательсва программиста.


    Вижу вижу
    Автор: adontz
    Дата: 08.08.05
    . Согласен — рабочий вариант.
    Кстати, вопрос к знатокам .Net. В Java (вроде начиная с 1.5) можно стринг билдер сделать взаимозаменяемым с потоком вывода (они поддерживают интерфейс Appendable). А как с этим дело в C#?
    ... << RSDN@Home 1.1.4 stable rev. 510>>
    Я ненавижу Hibernate
    Автор: Andrei N.Sobchuck
    Дата: 08.01.08
    !
    Re[11]: Перегрузка == героин?
    От: Andrei N.Sobchuck Украина www.smalltalk.ru
    Дата: 09.08.05 12:45
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    ANS>>Так и нужно было писать не "В том же SQL-е это сплошь и рядом.", а "В том же MS SQL Server-е это сплошь и рядом."

    VD>Это не единственный сервер. Просто про него я точно помню.

    Хороша ж конкатенация:
    C:\...crosoft SQL Server\80\Tools\Binn>OSQL.EXE -U sa
    Password:
    1> SELECT 12 + '13';
    2> go
    
     -----------
              25


    Что касается не единственного сервера, то:

    Database Language SQL 1992

    4.2.2 Operations involving character strings

    4.2.2.1 Operators that operate on character strings and return
    character strings

    <concatenation operator> is an operator, |, that returns the char-
    acter string made by joining its character string operands in the
    order given.

    ... << RSDN@Home 1.1.4 stable rev. 510>>
    Я ненавижу Hibernate
    Автор: Andrei N.Sobchuck
    Дата: 08.01.08
    !
    Re[12]: Перегрузка == героин?
    От: vdimas Россия  
    Дата: 09.08.05 12:47
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>Я тебе по сикрету скажу, что некоторые товарищи для помещения значений в потоки операторы побитовых сдвигов испоьзуют.


    Я думаю, что у этих товарищей понятие сдвига и ввода-вывода ассоциируются.

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

    Правда, что весьма напрягало, так это то, что направление сдвига противоположно сигнатуре оператора, ибо преобладают протоколы с передачей начиная от младших бит.
    Re[28]: No String Builder
    От: Oyster Украина https://github.com/devoyster
    Дата: 09.08.05 12:51
    Оценка:
    Здравствуйте, adontz, Вы писали:

    A>А чем ты IL смотришь? Просто лично я гляжу ассемблерный код EXE'шника.


    Ассемблерный код чего, простите? .NET-приложения компилируются в код на IL, который затем выполняется рантаймом. Вот этот IL я и смотрю Reflector-ом...
    Re[23]: No String Builder
    От: Andrei N.Sobchuck Украина www.smalltalk.ru
    Дата: 09.08.05 12:56
    Оценка:
    Здравствуйте, Oyster, Вы писали:

    O>Код:


    O>
    O>            string e = a + b + c + d;
    O>

    O>IL:

    O>
    O>      L_001c: call string string::Concat(string, string, string, string)
    O>


    Искуственный пример. Рассмотрим лучше:

    string z = x + GenerateLongString()+y;


        aStringBuilder.append(x);
        GenerateLongString(aStringBuilder);
        aStringBuilder.append(y);
    ... << RSDN@Home 1.1.4 stable rev. 510>>
    Я ненавижу Hibernate
    Автор: Andrei N.Sobchuck
    Дата: 08.01.08
    !
    Re[29]: No String Builder
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 09.08.05 13:01
    Оценка:
    Здравствуйте, Oyster, Вы писали:

    O>Ассемблерный код чего, простите? .NET-приложения компилируются в код на IL, который затем выполняется рантаймом. Вот этот IL я и смотрю Reflector-ом...


    Это как? C# Compiler генерирует IL. Но IL не выполняется, .Net Framework его сперва компилирует в машинный код (ассемблер просто более человечное его представление). Вот сгенерированный ассемблерный код я и глядел
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[24]: No String Builder
    От: Oyster Украина https://github.com/devoyster
    Дата: 09.08.05 13:10
    Оценка:
    Здравствуйте, Andrei N.Sobchuck, Вы писали:

    ANS>Искуственный пример. Рассмотрим лучше:


    ANS>
    ANS>string z = x + GenerateLongString()+y;
    ANS>

    Тут будет то же самое (вызов string.Concat с тремя параметрами).

    ANS>
    ANS>    aStringBuilder.append(x);
    ANS>    GenerateLongString(aStringBuilder);
    ANS>    aStringBuilder.append(y);
    ANS>
    Re[25]: No String Builder
    От: Andrei N.Sobchuck Украина www.smalltalk.ru
    Дата: 09.08.05 13:20
    Оценка:
    Здравствуйте, Oyster, Вы писали:

    O>Здравствуйте, Andrei N.Sobchuck, Вы писали:


    ANS>>Искуственный пример. Рассмотрим лучше:


    ANS>>
    ANS>>string z = x + GenerateLongString()+y;
    ANS>>

    O>Тут будет то же самое (вызов string.Concat с тремя параметрами).

    Я к тому, что верхняя запись не преобразуется же в нижнюю. Которая, суть более оптимальній вариант.
    ANS>>
    ANS>>    aStringBuilder.append(x);
    ANS>>    GenerateLongString(aStringBuilder);
    ANS>>    aStringBuilder.append(y);
    ANS>>
    ... << RSDN@Home 1.1.4 stable rev. 510>>
    Я ненавижу Hibernate
    Автор: Andrei N.Sobchuck
    Дата: 08.01.08
    !
    Re[27]: Очепятка
    От: Oyster Украина https://github.com/devoyster
    Дата: 09.08.05 13:26
    Оценка:
    Читать так:

    O>А почему вы решили, что


    O>
    O>// это то, во что преобразится string z = x + GenerateLongString()+y;
    O>string z = string.Concat(x, GenerateLongString(), y);
    O>

    O>будет менее оптимально, чем

    ANS>>>>
    ANS>>>>    aStringBuilder.append(x);
    ANS>>>>    GenerateLongString(aStringBuilder);
    ANS>>>>    aStringBuilder.append(y);
    ANS>>>>
    Re[32]: No String Builder
    От: Oyster Украина https://github.com/devoyster
    Дата: 09.08.05 14:24
    Оценка:
    Здравствуйте, adontz, Вы писали:

    O>>С помошью чего глядели? Можно пример в студию (в котором много вызовов string.Concat вместо одного)?


    A>Debug\Windows\Disassembly. Для того чтобы поглядеть в релизе надо unmanaged debugging включить.


    Ну вот. Увидел в Disassembly Window вот такой код:

    00000053  call        dword ptr ds:[003E50D0h]
    00000059  mov         dword ptr [ebp-1Ch],eax
    0000005c  call        dword ptr ds:[003E50D0h]
    00000062  mov         ebx,eax
    00000064  call        dword ptr ds:[003E50D0h]
    0000006a  mov         esi,eax
    0000006c  call        dword ptr ds:[003E50D0h]
    00000072  mov         edi,eax
    00000074  push        esi
    00000075  push        edi
    00000076  mov         edx,ebx
    00000078  mov         ecx,dword ptr [ebp-1Ch]
    0000007b  call        dword ptr ds:[79BF9DACh]
    00000081  mov         esi,eax
    00000083  mov         dword ptr [ebp-18h],esi

    Как видите, сначала идут 4 call к SomeFuncReturningString(), а потом только один call string.Concat. Выходит, вы неправы, уважаемый adontz?
    Re[10]: Перегрузка == героин?
    От: Quintanar Россия  
    Дата: 09.08.05 14:39
    Оценка:
    Здравствуйте, Геннадий Васильев, Вы писали:

    ГВ>Мне не мешает управление памятью. Наоборот — красивое решение содержит в себе элегантное управление памятью (вернее — жизненным циклом объектов, а не памятью как таковой) как неотъемлемую часть. И не надо сравнивать с математикой — любая формула из ВМ включает в себя элементарные операции сложения/умножения.


    Если бы каждый элегантно разрабатывал бы болты под себя, а не пользовался набором стандартных, то цивилизации не существовало бы. Конструктор может позволить себе не заниматься такими мелочами, а сконцентрироваться на машине в целом.
    Re[28]: Очепятка
    От: Andrei N.Sobchuck Украина www.smalltalk.ru
    Дата: 09.08.05 15:00
    Оценка:
    Здравствуйте, Oyster, Вы писали:

    O>>А почему вы решили, что


    O>>
    O>>// это то, во что преобразится string z = x + GenerateLongString()+y;
    O>>string z = string.Concat(x, GenerateLongString(), y);
    O>>

    O>>будет менее оптимально, чем

    потому, что требуется в буфере места для GenerateLongString() плюс место на саму возвращаемую строку, а в нижнем примере всё выводится сразу в буфер. Выиграш, на длину возвращаемой строки. И это не всё. Если в том вызове много конкатенаций, то всё это — создание временных объектов, а значит лишняя нагрузка. Этот как разница между DOM и SAX.

    ANS>>>>>
    ANS>>>>>    aStringBuilder.append(x);
    ANS>>>>>    GenerateLongString(aStringBuilder);
    ANS>>>>>    aStringBuilder.append(y);
    ANS>>>>>
    ... << RSDN@Home 1.1.4 stable rev. 510>>
    Я ненавижу Hibernate
    Автор: Andrei N.Sobchuck
    Дата: 08.01.08
    !
    Re[29]: Очепятка
    От: Oyster Украина https://github.com/devoyster
    Дата: 09.08.05 15:03
    Оценка:
    Здравствуйте, Andrei N.Sobchuck, Вы писали:

    ANS>потому, что требуется в буфере места для GenerateLongString() плюс место на саму возвращаемую строку, а в нижнем примере всё выводится сразу в буфер. Выиграш, на длину возвращаемой строки. И это не всё. Если в том вызове много конкатенаций, то всё это — создание временных объектов, а значит лишняя нагрузка. Этот как разница между DOM и SAX.


    Упс... да, тут я совсем неправ. Для таких случаев StringBuilder, конечно, эффективнее — это бесспорно.
    Re[10]: Перегрузка == героин?
    От: Павел Кузнецов  
    Дата: 09.08.05 15:26
    Оценка:
    Здравствуйте, Quintanar, Вы писали:

    Q>Вектор — это просто одномерный массив, а по простому отображение множества {1..N} в множество некоторых элементов.


    Ну, пожалуй, не просто одномерный массив: если подразумевать вектор в смысле элемента линейного пространства, то важны свойства операций над ним.

    Q> В твоем примере сразу виден порочный подход к перегрузке операторов, типичный для "свободного" С++ника. Арифметическое произведение использовано для скалярного произведения, чем сразу же нарушаются все мыслимые свойства операции *, которые мы вправе от нее ожидать. Использовать * для векторного произведения тоже нельзя, поскольку векторное произведение не коммутативно.


    А почему обязательно считать, что произведение в данном случае — операция арифметическая? Дальше, коммутативность не есть обязательное свойство умножения, по крайней мере, в теории групп. Может, ты хотел написать вместо "коммутативность" "ассоциативность", т.к. последнее, действительно, есть необходимое свойство умножения (с позиции теории групп)? Выводы, правда, остаются теми же самыми. Использовать * для векторного произведения неудачно, т.к. нарушаются совсем базовые свойства умножения: нет ассоциативности, нет "единицы", нет обратного элемента и т.п.

    Есть еще одна, имхо, более существенная, причина, почему в общем случае использовать * для векторного произведения нет смысла: векторное "произведение" для двух "множителей" определено только для трехмерных векторов. В случае n-мерных векторов операндов будет n-1, что, очевидно, с помощью operator * выразить не удастся.

    Третья причина заключается в неоднозначности чтения кода a * b в случае векторов. Читатель может воспринимать это как "скалярное произведение" (что arguably может быть более естественным), так и как "векторное произведение".

    Q>В математике есть определенная иерархия структур типа полугруппа, группа, ассоциативная группа, полукольцо, кольцо и т.д. Все что встречается на практике неизбежно попадает под одно из определений, так что особо думать не надо.


    Да, похоже, все-таки речь шла о произведении в смысле операции, задающей группу. Тогда о коммутативности стоит говорить только для абелевых групп, что обязательным требованием не является.
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[11]: Перегрузка == героин?
    От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
    Дата: 09.08.05 16:16
    Оценка:
    Здравствуйте, Quintanar, Вы писали:

    ГВ>>Мне не мешает управление памятью. Наоборот — красивое решение содержит в себе элегантное управление памятью (вернее — жизненным циклом объектов, а не памятью как таковой) как неотъемлемую часть. И не надо сравнивать с математикой — любая формула из ВМ включает в себя элементарные операции сложения/умножения.


    Q>Если бы каждый элегантно разрабатывал бы болты под себя, а не пользовался набором стандартных, то цивилизации не существовало бы.

    Интересно, а откуда бы тогда болты взялись?

    Q>Конструктор может позволить себе не заниматься такими мелочами, а сконцентрироваться на машине в целом.

    Хороший конструктор обычно помнит о том, что болты должны быть из стали XXXXX, а не из абы-чего-лишь-бы-с-резьбой и при этом вполне помнит и о машине в целом.
    ... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
    Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
    P.S.: Винодельческие провинции — это есть рулез!
    Re[12]: Перегрузка == героин?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 09.08.05 19:15
    Оценка:
    Здравствуйте, Andrei N.Sobchuck, Вы писали:

    ANS>Хороша ж конкатенация:

    ANS>
    ANS>C:\...crosoft SQL Server\80\Tools\Binn>OSQL.EXE -U sa
    ANS>Password:
    1>> SELECT 12 + '13';
    2>> go
    
    ANS> -----------
    ANS>          25
    ANS>


    Так ты строки складывай и будет тебе щастье. А не проверяй как привдения типов делаются.
    ... << RSDN@Home 1.2.0 alpha rev. 591>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[7]: Перегрузка == героин?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 09.08.05 19:15
    Оценка:
    Здравствуйте, Quintanar, Вы писали:

    VD>>Есть такая штука — практика. И она показывает, что никаких проблем перегрузка не вызывает. На практике никто не кидается перегружать все какие можно операторы для все попавшихся под руку типов. Те кто может навалять дурака просто недодумываются применить это средство.


    Q>Никаких доказательств этим утверждениям нет, поэтому стоит убрать из рассмотрения.


    Есть вещи которые не нужно доказывать. Кстати, доказательств неприемлемости "+" для конкатинации тоже нет и быть не может. Это разговоры о вкусах и привычках. Но то что проблем со сложением строк нет можно опровергнуть. Попробуй найти чью нибудь жалобу на то, что он не понял что такое "а" + "б". Я таких не встречал.
    ... << RSDN@Home 1.2.0 alpha rev. 591>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[26]: No String Builder
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 09.08.05 19:15
    Оценка:
    Здравствуйте, adontz, Вы писали:

    A>Если уж на то пошло откровенная ерунда это то, что говоришь


    Слава богу не тебе об этом судить.

    A> Выдрал какой-то куцый пример и обрадовался.


    Я что-то выдерал? Та в очередной раз начал рассуждать о сложении строк через "+" основываясь на своих тараканах почерпнутых в С++. Я тебе заметил, что ты заблуждашся. Ты вместо того чтобы разобраться и запомнить, что не все делается аналогично тому как это сделано в С++, откровенно соврал, что посмотрел сгенерированный код.

    Странно, что тебе приходится пересказывать события просходящие с тобой лично.

    A>Складывать строки когда они так навиду не велика заслуга.


    Ну, где как. В Шарпе не сомненн.

    A> Что-то я в более жизненных случаях никаких оптимизаций от компилятора не заметил.


    Чем случай не жиненный? Я так постоянно пользуюсь сложением строк. А если нужно что-то в цикле складывать создаю StringBuilder. И жить становится просто, сухо и т.п.

    A> Так что я не понял что ты пытаешься доказать?


    Ничего. Просто обратил внимание окружающих на то что твои расуждения и утверждения далеки от реальности.

    A> Что компилятор в искуственно упрощённом коде может что-то оптимизировать? Ура!


    Ура!

    A>
    A>using System;
    
    A>namespace cstest
    A>{
    A>    class CSTest
    A>    {
    A>        static string SomeFuncReturningString()
    A>        {
    A>            return "qwerty";
    A>        }
            
    A>        [STAThread]
    A>        static void Main(string [] args)
    A>        {
    A>            string a = "aaa";
    A>            string b = "bbb";
    A>            string c = "ccc";
    A>            string d = "ddd";
                
    A>            string e = SomeFuncReturningString() + SomeFuncReturningString() + SomeFuncReturningString() + SomeFuncReturningString();
    A>        }
    A>    }
    A>}
    A>


    Это откровение? Что ты хотел этим сказать, то?

    Кстати, хочешь расскажу что будет в приведенном тбою примере?

    Так вот, строка:
    string e = SomeFuncReturningString() 
        + SomeFuncReturningString()
        + SomeFuncReturningString()
        + SomeFuncReturningString();

    Превратится компилятором C# в:
    string e = string.Concat(SomeFuncReturningString(),
        SomeFuncReturningString(),
        SomeFuncReturningString(),
        SomeFuncReturningString());

    если эту программу запустить в релизе, то JIT произведет подстановку тел SomeFuncReturningString() и код получится:
    string e = string.Concat("qwerty", "qwerty", "qwerty", "qwerty");

    Дальше у компилятора скорее всего фантазия не пойдет. Но пример твой надумнный и в жизни строки бы все равно были бы не статическими и их пришлось бы конкатинировать. В общем, скорость была бы очень даже высокая.
    ... << RSDN@Home 1.2.0 alpha rev. 591>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[31]: No String Builder
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 09.08.05 19:19
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>Ой, а может поделишся как ты это делашь?


    Выбираю в меню стулии Debug\Start включив до того Native Code Debugging. Что-то я не понял чему ты так удивляешь. Как будто отладкой никогда не занимался
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[33]: No String Builder
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 09.08.05 19:20
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    A>>Debug\Windows\Disassembly.

    VD>Ух ты! А это где?

    А это в главном меню студии.

    A>> Для того чтобы поглядеть в релизе надо unmanaged debugging включить.

    VD>В чем? И зачем?

    Влад, ты конечно извини, но твои вопросы вызывают во мне подозрения. Ты хоть раз отладкой занимался?
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[34]: No String Builder
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 09.08.05 19:50
    Оценка:
    Здравствуйте, adontz, Вы писали:

    A>А это в главном меню студии.


    А... Ну, тогда на будующее знай, что дизасемблированный код полученный из под отладчика и исполняемый в релизе без отладчика (это очень важно!) — это, порой, совсем разный код. Разника как в С++ в дебаге и релизе.

    A>>> Для того чтобы поглядеть в релизе надо unmanaged debugging включить.

    VD>>В чем? И зачем?

    A>Влад, ты конечно извини, но твои вопросы вызывают во мне подозрения. Ты хоть раз отладкой занимался?


    Клинический случай. Ты даже не понимашь когда над тобой стебаются.

    Твои слова "Для того чтобы поглядеть в релизе надо unmanaged debugging включить." — это полная глупость. Если тебе действительно интересно как полгядеть код в релизе, то смотри: Re[33]: No String Builder
    Автор: VladD2
    Дата: 09.08.05
    ... << RSDN@Home 1.2.0 alpha rev. 591>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[32]: No String Builder
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 09.08.05 19:50
    Оценка:
    Здравствуйте, adontz, Вы писали:

    VD>>Ой, а может поделишся как ты это делашь?


    A>Выбираю в меню стулии Debug\Start включив до того Native Code Debugging.


    Так между прочим... Знай, что "включив до того Native Code Debugging" полная глупость. "Native Code Debugging" — это возможность отлаживать не управляемый код. Например, если пишешь на МС++ или нужно отладить КОМ-сервер/ДЛЛ. А "Выбираю в меню стулии Debug\Start" не полная, но с большой вероятностью даст совсем не тор результат что будет в релизе без отладчика.

    A> Что-то я не понял чему ты так удивляешь. Как будто отладкой никогда не занимался


    Тому с кокой уверенностью ты говоришь о вещах в которых не разобрался.
    ... << RSDN@Home 1.2.0 alpha rev. 591>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[27]: No String Builder
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 09.08.05 19:50
    Оценка:
    Здравствуйте, adontz, Вы писали:

    A>Да нет, я понял о чём я говорил и это не совсем то о чём говорил ты. Вобщем код ниже аналогичен использованию StringBuilder.Append гораздо медленнее его, не оптимизируется никаким C# компилятором и может быть оптимизирован за счёт перегрузки операторов (без изменения того куска кода который я привёл, разве что тип будет уже не string).

    A>
    A>string a = "qwerty";
    A>a += "asdfgh";
    A>a += "asdfgh";
    A>a += "asdfgh";
    A>a += "asdfgh";
    A>


    A>Возражения есть?


    Нет. На этот раз никаких. А что?
    ... << RSDN@Home 1.2.0 alpha rev. 591>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[35]: No String Builder
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 09.08.05 19:54
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>А... Ну, тогда на будующее знай, что дизасемблированный код полученный из под отладчика и исполняемый в релизе без отладчика (это очень важно!) — это, порой, совсем разный код. Разника как в С++ в дебаге и релизе.


    А код релиза исполняемого просто так и релиза исполняемого под отладчиком различаются?
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re: Перегрузка == героин?
    От: Maxim S. Shatskih Россия  
    Дата: 09.08.05 22:27
    Оценка:
    Правильно все он пишет ИМХО. Сам такую же точно статью писал, но по-русски.

    К>Собственно хотелось бы обсудить вот эту статью — автор утверждает, что перегрузка (операторов/функций) увеличивает сложность программ и понижает их читаемость. Критикуются плюсы с их довольно обширными правилами приведения типов и пр.
    Занимайтесь LoveCraftом, а не WarCraftом!
    Re[12]: Перегрузка == героин?
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 10.08.05 00:17
    Оценка:
    Здравствуйте, Шахтер, Вы писали:

    Q>>Конструктор может позволить себе не заниматься такими мелочами, а сконцентрироваться на машине в целом.

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


    Угу. И для каждого нового автомобиля заново придумывают болты и гайки? Гы-гы.
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[13]: Перегрузка == героин?
    От: Шахтер Интернет  
    Дата: 10.08.05 01:49
    Оценка:
    Здравствуйте, adontz, Вы писали:

    A>Здравствуйте, Шахтер, Вы писали:


    Q>>>Конструктор может позволить себе не заниматься такими мелочами, а сконцентрироваться на машине в целом.

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


    A>Угу. И для каждого нового автомобиля заново придумывают болты и гайки? Гы-гы.


    Автомобили бывают разные. Очень разные.
    И болты и гайки тоже, между прочим.
    В XXI век с CCore.
    Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
    Re[13]: Перегрузка == героин?
    От: Andrei N.Sobchuck Украина www.smalltalk.ru
    Дата: 10.08.05 06:57
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    ANS>>Хороша ж конкатенация:

    ANS>>
    ANS>>C:\...crosoft SQL Server\80\Tools\Binn>OSQL.EXE -U sa
    ANS>>Password:
    1>>> SELECT 12 + '13';
    2>>> go
    
    ANS>> -----------
    ANS>>          25
    ANS>>


    VD>Так ты строки складывай и будет тебе щастье. А не проверяй как привдения типов делаются.


    Демонстрация потенциального источника ошибок. Как и C с адресной арифметикой. Этот аргумент тебе знаком?
    ... << RSDN@Home 1.1.4 stable rev. 510>>
    Я ненавижу Hibernate
    Автор: Andrei N.Sobchuck
    Дата: 08.01.08
    !
    Re[36]: No String Builder
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 10.08.05 08:39
    Оценка:
    Здравствуйте, adontz, Вы писали:

    A>А код релиза исполняемого просто так и релиза исполняемого под отладчиком различаются?


    Да. В частности инлайнинг под отладчиком не делается.
    ... << RSDN@Home 1.2.0 alpha rev. 599>>
    AVK Blog
    Re[36]: No String Builder
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 10.08.05 09:05
    Оценка:
    Здравствуйте, adontz, Вы писали:

    A>А код релиза исполняемого просто так и релиза исполняемого под отладчиком различаются?


    Да. У джита есть опция JitOptimizations при запуске под отладчиком она автоматически выставляется в 0 (т.е. выключается). Даже при старте под управлением cordbg она выключена. Но в cordbg ее можно включить перед запуском приложения. При "JitOptimizations=0" код мало чем отличается от дебажного. Если бы ты прочел внимательно это
    Автор: VladD2
    Дата: 09.08.05
    , то глядишь вместо улыбки появилось бы некоторое понимание вопроса.
    ... << RSDN@Home 1.2.0 alpha rev. 591>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[14]: Перегрузка == героин?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 10.08.05 09:05
    Оценка:
    Здравствуйте, Andrei N.Sobchuck, Вы писали:

    ANS>Демонстрация потенциального источника ошибок. Как и C с адресной арифметикой. Этот аргумент тебе знаком?


    Ты путашь мякое с теплым. Ты продемонстрировал некотороую опасность автоматического приведения типов. И к оператору сложения строк это отношения не имеет. Так что твое подмигивание больше похоже на нервный тик.
    ... << RSDN@Home 1.2.0 alpha rev. 591>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[15]: Перегрузка == героин?
    От: Курилка Россия http://kirya.narod.ru/
    Дата: 10.08.05 09:47
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>Здравствуйте, Andrei N.Sobchuck, Вы писали:


    ANS>>Демонстрация потенциального источника ошибок. Как и C с адресной арифметикой. Этот аргумент тебе знаком?


    VD>Ты путашь мякое с теплым. Ты продемонстрировал некотороую опасность автоматического приведения типов. И к оператору сложения строк это отношения не имеет. Так что твое подмигивание больше похоже на нервный тик.


    Возвращаясь к исходной статье, хоть она и не очень корректна, но доля правды там есть. Так вот, там говорится, что перегрузка как раз неявными автоматическими приведениями типов и опасна, т.е. такими ситуациями, когда программист затрудняется сказать, какая именно реализация оператора/функции из энного числа имеющихся будет использована. Как раз это и показал тебе Андрей
    Re[3]: Перегрузка == героин?
    От: VladGal  
    Дата: 10.08.05 09:53
    Оценка:
    Здравствуйте, Курилка, Вы писали:

    К>Здравствуйте, VladGal, Вы писали:


    VG>>Ага, а шаблоны (templates) — LSD 25. Всё это беспочвенные теоретические рассуждения, причём автор статьи похоже не знаком с вопросом


    К>Факты?

    >>In general, overloading means that a function name or an operator has two or more distinct meanings.
    >>When you use it, the types of its operands are used by the language to determine which meaning should apply
    Чем не факт?
    ... << RSDN@Home 1.1.4 stable rev. 510>>
    Re[4]: Перегрузка == героин?
    От: Курилка Россия http://kirya.narod.ru/
    Дата: 10.08.05 10:02
    Оценка:
    Здравствуйте, VladGal, Вы писали:

    VG>Здравствуйте, Курилка, Вы писали:


    К>>Здравствуйте, VladGal, Вы писали:


    VG>>>Ага, а шаблоны (templates) — LSD 25. Всё это беспочвенные теоретические рассуждения, причём автор статьи похоже не знаком с вопросом


    К>>Факты?

    >>>In general, overloading means that a function name or an operator has two or more distinct meanings.
    >>>When you use it, the types of its operands are used by the language to determine which meaning should apply
    VG>Чем не факт?

    И? Хочешь сказать это не верно? В чём на твой взгляд ошибка?
    Возьмём к примеру тот же "+", который тут обсуждали — существует далеко не 1 вариант оператора и выбираемый определяется типом аргументов, т.е. для int это будет просто сложение, тогда как для std::string парой ассемблерных комманд скорее всего не обойдёшься, про вектора и матрицы я молчу...
    Так где твои факты? И кто не знаком с вопросом — тут ещё можно поспорить.
    Re[16]: Перегрузка == героин?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 10.08.05 10:09
    Оценка:
    Здравствуйте, Курилка, Вы писали:

    К>Возвращаясь к исходной статье, хоть она и не очень корректна, но доля правды там есть. Так вот, там говорится, что перегрузка как раз неявными автоматическими приведениями типов и опасна, т.е. такими ситуациями, когда программист затрудняется сказать, какая именно реализация оператора/функции из энного числа имеющихся будет использована. Как раз это и показал тебе Андрей


    По этому приводятся примеры осуществлющие нефвные приведения не зависимо от перегрузки?

    Есть языки с хорошими соглашениями по приведению типов. В том же Шарпе значимых проблем с приведением типов при преегрузке операторов. Ну, нет и все. Любой объект приводится к сроке за счет существования у него метода ToSting, так что всегда можно сложить что-то со строкой и получить конкатинацию. Приведения типов для других классов контролируются операторами приведения типов. Так что можно реализовато любую логику. И только от программиста зависит их логичность.

    Если бы эта проблема существовала бы в действительности, то на форумах то идело появлялись бы вопросы связанные с этим. А где они?

    В общем, еще раз говорю. Не путайте теплое с мягким. Неявные приведения итпов и проблемы с ними связанные это одна проблема. Использование перегрузки операторов — это другая. Они никак не связаны. Точно так же можно найти фатальный недостаток в перегрузке функций, так как при их выхове тоже могут случиться неявные приведения типов.
    ... << RSDN@Home 1.2.0 alpha rev. 591>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[10]: Перегрузка == героин?
    От: ansi  
    Дата: 10.08.05 10:52
    Оценка:
    Здравствуйте, Quintanar, Вы писали:

    A>>Математические операции неприменимы. Но вроде как должна быть операция соединения. Как лучше ее обозначить... Наверное все-таки +.

    Q>Чем лучше-то? Тем, что когда-то кто-то не подумав стал ее для этого использовать? Конкатенация объектов есть в математике (это суперпозиция функций, например) и она обладает определенными свойствами — например, ассоциативностью, нулевым элементом.

    Ну да, суперпозиция обозначается пустым кружочком. Где он на клавиатуре? Нету.
    Вообще, соединение массивов не такая уж часто используемая операция, посему можно использовать символьное имя. Правда о борьбе с синтаксическим оверхедом придется забыть
    Но мне интересно, какие возражения против +?

    Q>Вектор — это просто одномерный массив, а по простому отображение множества {1..N} в множество некоторых элементов.

    Нет. Вектор — это направленный отрезок. И уж никак не отображение {1..N} в множество некоторых элементов (чем массив является на самом деле, т.е. функция заданная таблично). Вектор не обязательно должен быть реализован на базе массива, хотя чаще всего так и делается. Доступ к координатам вектора вообще используется редко, так как для него важны именно математические операции. И мне, кстати, никогда не нравилось наименование std::vector<int>... Уж лучше бы std::array<int>.
    И вообще, я же написал, что все эти перечисленные структуры в принципе (в программировании) есть ни что иное, как массивы и списки, но с различной семантикой. Если вам нужен именно массив, то и используйте массив, а не вектор.

    Q> В твоем примере сразу виден порочный подход к перегрузке операторов, типичный для "свободного" С++ника.

    Типа, изобличил, да?

    Q>Арифметическое произведение использовано для скалярного произведения, чем сразу же нарушаются все мыслимые свойства операции *, которые мы вправе от нее ожидать.

    Почему оно является арифметическим? Потому что мы к работе с числам привыкли?

    Q>Использовать * для векторного произведения тоже нельзя, поскольку векторное произведение не коммутативно.

    А почему она обязана быть коммутативной?

    Q>Матрица — это тоже самое, что вектор, только отображение будет из {1...N}*{1...M} -> A.

    Q>Сумма и разность, естественно, будут работать, поскольку это группа. Но умножение не коммутативно, что легко может ввести в заблуждение.

    Опять же, матрица — это не отображение. Это набор m*n элементов, как бы это сказать, в m строках и n столбцах.
    То, что вы называете отображением — это двумерный массив.

    Мне вот интересно, человек работает с матрицами, а запись A*B его вводит в заблуждение... Да нет этой проблемы, какое тут может быть заблуждение?


    Q>Есть аналог. В частности в теории грамматик. Естественно, арифметические операции над строками смысла не имеют, поэтому не надо использовать символ арифметической операции для конкатенации строк.


    Опять же, что значит арифметическая операция? И почему она обязана быть коммутативной? Или может опять запись "ad" + "bc" вводит в заблуждение? Нет, проблем с этим нет. Потому как другого смысла, кроме как конкатенации, здесь и быть не может в принципе.

    Q>Нет, все это частные случаи отображений в случае теории множеств.

    Это не отображения.

    Q>В математике есть определенная иерархия структур типа полугруппа, группа, ассоциативная группа, полукольцо, кольцо и т.д. Все что встречается на практике неизбежно попадает под одно из определений, так что особо думать не надо.

    new RSDN@Home(1.1.4, 303) << new Message(); std::head::ear << "Therion — Via Nocturna (Part I And Part II)";
    Re[10]: Перегрузка == героин?
    От: ansi  
    Дата: 10.08.05 10:52
    Оценка:
    Здравствуйте, Трурль, Вы писали:


    Т>В математике есть строки, а операция конкатенации обычно не обозначется (реже обозначется ||).


    Дядя Страуструп еще пока не научил Си++ перегружать операцию "" и пробел... А обозначение || для конкатенации еще хуже, чем +.
    new RSDN@Home(1.1.4, 303) << new Message(); std::head::ear << "Therion — Via Nocturna (Part I And Part II)";
    Re[5]: Перегрузка == героин?
    От: VladGal  
    Дата: 10.08.05 11:07
    Оценка:
    Здравствуйте, Курилка, Вы писали:

    К>Здравствуйте, VladGal, Вы писали:


    VG>>Здравствуйте, Курилка, Вы писали:


    К>>>Здравствуйте, VladGal, Вы писали:


    VG>>>>Ага, а шаблоны (templates) — LSD 25. Всё это беспочвенные теоретические рассуждения, причём автор статьи похоже не знаком с вопросом


    К>>>Факты?

    >>>>In general, overloading means that a function name or an operator has two or more distinct meanings.
    >>>>When you use it, the types of its operands are used by the language to determine which meaning should apply
    VG>>Чем не факт?

    К>И? Хочешь сказать это не верно? В чём на твой взгляд ошибка?

    К>Возьмём к примеру тот же "+", который тут обсуждали — существует далеко не 1 вариант оператора и выбираемый определяется типом аргументов, т.е. для int это будет просто сложение, тогда как для std::string парой ассемблерных комманд скорее всего не обойдёшься, про вектора и матрицы я молчу...
    К>Так где твои факты? И кто не знаком с вопросом — тут ещё можно поспорить.
    adontz кажеться писал уже на этут тему вот что:

    Полная чушь! Суть как раз в том, что бы применять одно и тоже понятие к разным типам.

    Присоединяюсь.
    ... << RSDN@Home 1.1.4 stable rev. 510>>
    Re[6]: Перегрузка == героин?
    От: Курилка Россия http://kirya.narod.ru/
    Дата: 10.08.05 11:49
    Оценка:
    Здравствуйте, VladGal, Вы писали:

    VG>adontz кажеться писал уже на этут тему вот что:

    VG>

    VG>Полная чушь! Суть как раз в том, что бы применять одно и тоже понятие к разным типам.

    VG>Присоединяюсь.

    Т.е. фактов, кроме сказанного adontz нет? Замечательно
    Тут (чтот не могу найти) указали, что больное место перегрузки — ну ни разу не обязательно оно одно и тоже понятие! То, что оно выглядит как "+", допустим, не гарантирует то, что оно не будет жёсткий диск форматировать. Конечно это ответственность программиста написавшего код, чтобы он (код) делал то, что записано. Но с неявными преобразованиями не всегда простым образом можно определить какой вариант будет предпочтён и что получится как результат 1 + "2" — 3 или "12".
    Re[9]: Перегрузка == героин?
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 10.08.05 13:07
    Оценка:
    Здравствуйте, Курилка, Вы писали:

    К>Не спорю, так и есть. Автор статьи как раз и писал (на мой взгляд), что не оглядываясь на последствия можно получить неожиданные (плачевные) сюрпризы. И по-твоему из этого VladGal имел право обвинить автора в незнании предмета?


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

    Unfortunately, given this new toy, programmers can seldom resist overusing it. The result is that all sorts of fundamentally different meanings get overloaded on the same name or operator.


    К сожалению, получив новую игрушку, программисты редко могут удержатся от её черезмерного использования. Результатом является то, что все виды фундаментально различных понятий перегруженны под одним и тем же именем или оператором.


    Диагноз из психбольницы какой-то Так и представляю себе программиста перегружающего + для сортировки. Эдакое
    vector<int> array1;
    ...
    vector<int> array2 = array1 + quick_sort_tag;

    Ужас
    Где он таких только нашёл?
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[17]: Перегрузка == героин?
    От: Quintanar Россия  
    Дата: 10.08.05 13:21
    Оценка:
    Здравствуйте, _vovin, Вы писали:

    _>Неявные преобразования типов относятся к характеристикам языков со слабой типизацией (weakly typed languages). Но, в реальности, ни один практичный язык не может быть на 100% сильно типизированным, поэтому такие маленькие отступления допустимы.


    Как это не может? Еще как может.

    >Язык становится слаботипизированным, когда отклонения от правил типизации имеют глобальный характер, как в случае с указателями для C.

    _>Но такие вещи, как волшебный оператор сложения строк и автоматическое преобразование типов, не добавляет красоты и стройности языку. Намного лучше, когда все подчиняется одному своду правил. Например, есть коллекции с оператором конкатенации (, & ++ — что угодно уникальное), а строка, как частный случай коллекции наследует этот оператор.

    Я уже писал, что кое-где так и сделано ввиде Классов Типов. Т.е. нельзя реализовать + не реализовав — и нельзя реализовать + от аргументов разных типов.
    Re[15]: Перегрузка == героин?
    От: Шахтер Интернет  
    Дата: 11.08.05 01:49
    Оценка:
    Здравствуйте, adontz, Вы писали:

    A>Здравствуйте, Шахтер, Вы писали:


    Q>>>>>Конструктор может позволить себе не заниматься такими мелочами, а сконцентрироваться на машине в целом.

    Ш>>>>Неверно. Нет такой вещи -- машина в целом. Это только на картинке у художника так бывает. В инженерии целое есть сумма составных частей и качество этого целого определяется качеством каждого элемента, даже самого маленького.
    A>>>Угу. И для каждого нового автомобиля заново придумывают болты и гайки? Гы-гы.
    Ш>>Автомобили бывают разные. Очень разные.
    Ш>>И болты и гайки тоже, между прочим.

    A>Вот в том-то всё и дело, что очень разные автомобили собираются из одинаковых болтов и шает. К твоему сведенью, кроме формы корпуса и внутренней отделки ничего особо уникального в автомобилях нету — двигатель, тормоза, аммортизаторы, колёса можно увидеть и на других моделях.


    Двигатель у камаза и у жигулей один и тот же? А колёса?
    И тормоза одинаковые?
    В XXI век с CCore.
    Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
    Re[8]: Перегрузка == героин?
    От: Курилка Россия http://kirya.narod.ru/
    Дата: 11.08.05 08:05
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    AVK>Здравствуйте, Курилка, Вы писали:


    К>>Т.е. фактов, кроме сказанного adontz нет? Замечательно

    К>>Тут (чтот не могу найти) указали, что больное место перегрузки — ну ни разу не обязательно оно одно и тоже понятие! То, что оно выглядит как "+", допустим, не гарантирует то, что оно не будет жёсткий диск форматировать.

    AVK>Странная логика. А что, из за того что можно сделать метод Add, который на самом деле удаляет из коллекции, нужно объявить методы героином? В чем, в этом отношении, разница между операторами и методами?


    Дак я не говорю же, что логика верная и у меня претензий к ней нет, наоборот — программер должен отвечать за свои действия, не будет же компьютер выполнять все действия за него?
    Но почему из вот такой странной логики следует делать вывод что автор не разбирается в предмете — я не понял...
    И разницу между операторами и методами откуда ты взял, осталось загадкой, "+" был выбран лишь как пример, не более.
    Re[20]: Перегрузка == героин?
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 11.08.05 17:32
    Оценка:
    Здравствуйте, _vovin, Вы писали:

    _>Сложение чисел отлично ложится на операцию + (Number, Number). Для частных случаев может быть создана специализация (например + (int, int)), для остальных — двойная диспетчеризация с последующим приведением чисел к одному вышестоящему общему типу.


    Дааа.... представил себе как это всё будет понятно и эффективно
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[10]: Перегрузка == героин?
    От: pvgoran Россия  
    Дата: 12.08.05 14:39
    Оценка:
    Здравствуйте, adontz, Вы писали:

    A>Диагноз из психбольницы какой-то Так и представляю себе программиста перегружающего + для сортировки. Эдакое

    A>
    A>vector<int> array1;
    A>...
    A>vector<int> array2 = array1 + quick_sort_tag;
    A>

    A>Ужас
    A>Где он таких только нашёл?

    А что — интересная идея! Мне понравилось!
    ... << RSDN@Home 1.1.4 stable rev. 510>>
    Re[10]: Перегрузка == героин?
    От: Andir Россия
    Дата: 13.08.05 10:18
    Оценка:
    Здравствуйте, eao197, Вы писали:

    E>Справедливости ради можно добавить, что в зависимости от левого операнда оператора сдвига выполняемое действие может очень сильно меняться:

    E>
    
    E>// Вычисляем MD5-хеш двоичного образа.
    E>Md5_Hash hash;
    E>hash << my_data;
    E>


    А насчёт MD5 это просто по принципу или существует где-нибудь такая реализация криптографических примитивов?

    C Уважением, Andir!
    using( RSDN@Home 1.2.0 alpha r597 ) { /* Работаем */ }
     
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.