Здравствуйте, cranky, Вы писали:
A>>>>Полная чушь! Суть как раз в том, что бы применять одно и тоже понятие к разным типам.
Т>>>
Т>>>1+2
Т>>>"Hello "+ "world"
Т>>>
Т>>>Здесь "+" одно и то же понятие?
O>>Да. Понятие сложения. Для чисел результат — сумма, для строк — конкатенация. Но метафорический смысл един C>Ну да.
("Hello world"-"world") ? "Hello "
Или иначе: как отнимать строки, если сложение (в виде конкатенации) возможно? C>В случае соединения строк мне больше нравится введение нового оператора в язык, например, тильда в D.
O>>Но вот, например, "<<" в C++ и оператор побитового сдвига, и оператор вывода в поток — вот тут уже явно разные понятия. C>С++ вообще проектировался по принципу минимальных нововведений в синтаксис языка, отсюда и операторы в/в потоков, и обозначение ЧВФ, и некоторые другие вещи.
И мабуть, это таки правильно. На C++ мне нравилось писать std::cout << 1 << " is not " << 2. Но я не спрашивал "почему", я писал "вот, смотрите, тут у них разный смысл".
Здравствуйте, VladD2, Вы писали:
VD>Вот если "Hello " + "world" будет заниматься побайтным сложением строк, или еще какую фигню делать, то это уже будет уродство.
Здравствуйте, Трурль, Вы писали:
VD>>Вот если "Hello " + "world" будет заниматься побайтным сложением строк, или еще какую фигню делать, то это уже будет уродство.
Т>А каково "правильное" значение выражения Т>
Или я опять неправ?
Т>Но есть не менее общепринятая интерпретация для сложения двух векторов.
Хмм... в C#, например, есть char[] и есть string. Второе также можно назвать "вектором символов", но уже с трудом (string уже как минимум read-only). Согласитесь, когда на таком уровне проводят разделительную черту между массивом символов и строкой, можно считать строку строкой, а не вектором, и переопределить для неё оператор +, поскольку для строки у этого оператора есть только один смысл.
Здравствуйте, Oyster, Вы писали:
O>Здравствуйте, cranky, Вы писали:
O>>>Да. Понятие сложения. Для чисел результат — сумма, для строк — конкатенация. Но метафорический смысл един C>>Ну да.
("Hello world"-"world") ? "Hello "
Или иначе: как отнимать строки, если сложение (в виде конкатенации) возможно? C>>В случае соединения строк мне больше нравится введение нового оператора в язык, например, тильда в D.
O>Меня не поняли O>Re[7]: Перегрузка == героин?
Да всё понятно. Но таки конкатенация — никаким боком не сложение, даже в программировании. И, на мой взгляд, это неправильно, когда в стандартной библиотеке (хорошо, что не в самом языке) для строк применяется оператор+. Если нет более подходящего, тогда уж лучше функции concat или strcat. Ведь никто не будет с аналогичной целью вводить + для векторов?
O>>>Но вот, например, "<<" в C++ и оператор побитового сдвига, и оператор вывода в поток — вот тут уже явно разные понятия. C>>С++ вообще проектировался по принципу минимальных нововведений в синтаксис языка, отсюда и операторы в/в потоков, и обозначение ЧВФ, и некоторые другие вещи.
O>И мабуть, это таки правильно. На C++ мне нравилось писать std::cout << 1 << " is not " << 2. Но я не спрашивал "почему", я писал "вот, смотрите, тут у них разный смысл".
Просто так, на всякий случай напомнить, почему так получилось...
Здравствуйте, Трурль, Вы писали:
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).
Здравствуйте, cranky, Вы писали:
O>>>>Да. Понятие сложения. Для чисел результат — сумма, для строк — конкатенация. Но метафорический смысл един C>>>Ну да.
("Hello world"-"world") ? "Hello "
Или иначе: как отнимать строки, если сложение (в виде конкатенации) возможно? C>>>В случае соединения строк мне больше нравится введение нового оператора в язык, например, тильда в D.
O>>Меня не поняли O>>Re[7]: Перегрузка == героин?
C>Да всё понятно. Но таки конкатенация — никаким боком не сложение, даже в программировании. И, на мой взгляд, это неправильно, когда в стандартной библиотеке (хорошо, что не в самом языке) для строк применяется оператор+. Если нет более подходящего, тогда уж лучше функции concat или strcat. Ведь никто не будет с аналогичной целью вводить + для векторов?
Да-да-да... но мне всё равно удобнее писать +
Кстати, а почему нельзя перегрузить + для векторов? Вот, скажем, у меня мат. либа для операций над векторами и матрицами...
O>>>>Но вот, например, "<<" в C++ и оператор побитового сдвига, и оператор вывода в поток — вот тут уже явно разные понятия. C>>>С++ вообще проектировался по принципу минимальных нововведений в синтаксис языка, отсюда и операторы в/в потоков, и обозначение ЧВФ, и некоторые другие вещи.
O>>И мабуть, это таки правильно. На C++ мне нравилось писать std::cout << 1 << " is not " << 2. Но я не спрашивал "почему", я писал "вот, смотрите, тут у них разный смысл". C>Просто так, на всякий случай напомнить, почему так получилось...
Здравствуйте, Oyster, Вы писали:
O>Здравствуйте, cranky, Вы писали:
C>>Да всё понятно. Но таки конкатенация — никаким боком не сложение, даже в программировании. И, на мой взгляд, это неправильно, когда в стандартной библиотеке (хорошо, что не в самом языке) для строк применяется оператор+. Если нет более подходящего, тогда уж лучше функции concat или strcat. Ведь никто не будет с аналогичной целью вводить + для векторов?
O>Да-да-да... но мне всё равно удобнее писать +
O>Кстати, а почему нельзя перегрузить + для векторов? Вот, скажем, у меня мат. либа для операций над векторами и матрицами...
Для цели поэлементного сложения аля сложения векторов — пожалуйста, да и то надо на всяк випадок проверить в справочнике по математике на совпадение последствий этого действия со смыслом сложения для скалярных типов. Но я имел в виду именно конкатенацию векторов, что вполне себе имеет право быть.
O>>>>>Но вот, например, "<<" в C++ и оператор побитового сдвига, и оператор вывода в поток — вот тут уже явно разные понятия. C>>>>С++ вообще проектировался по принципу минимальных нововведений в синтаксис языка, отсюда и операторы в/в потоков, и обозначение ЧВФ, и некоторые другие вещи.
O>>>И мабуть, это таки правильно. На C++ мне нравилось писать std::cout << 1 << " is not " << 2. Но я не спрашивал "почему", я писал "вот, смотрите, тут у них разный смысл". C>>Просто так, на всякий случай напомнить, почему так получилось...
O>Ггы. Значит, << можно, а + нет? Нечестно!
Случай битовых сдвигов не имеет столь древней истории применения в математике, как арифметических действий, поэтому возможности для перегрузки у них разные. Опять же, ИМХО.
Здравствуйте, 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++.
Обычно я не оверквочу, но мне пришлось оставить самую первую фразу:
>>>>>>Overloading function names saves time during writing by saving keystrokes and, more significantly, saves the mental effort of thinking up unique names.
потому как в ней было словосочетание, на которое ссылался мой оппонент:
ANS>В критикуемой цитате об этом и говорится.
Все последующие фразы также не смог выбросить, т.к. без контекста диалог был бы непонятен. Поэтому никакого оверквотинга — всё легально
, что конкатенация и сложение это разные вещи, и, соответсвенно, не согласен с тем, что это по сути одно и то же. Взять хотябы коммутативность.
O>Понятно. Я говорил как программист, а не как математик. Как для программиста, для меня достаточно удобно и понятно писать "abc" + "def" вместо "abc".concat("def"). Это и означает "добавление одного значения к другому" для строки.
Как по мне, то есть более приемлемый вариант — введение нового оператора, a-la "&" в VB, "," в ST или упоминавшееся выше "~" в D.
Кстати, в развитие темы, зачем ограничиваться строками? В ST "," применим ко всем упорядоченным коллекциям. Типа:
#(1 2 3) , #(4 5 6)
Результат #(1 2 3 4 5 6)
Здравствуйте, 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#), наилучший кандидат — именно +. И использовать его для конкатенации строк не есть зло.
Здравствуйте, Курилка, Вы писали:
К>Собственно хотелось бы обсудить вот эту статью — автор утверждает, что перегрузка (операторов/функций) увеличивает сложность программ и понижает их читаемость. Критикуются плюсы с их довольно обширными правилами приведения типов и пр.
Перегрузка — диспетчеризация по типу аргумента(-ов), выполняемая на
этапе компиляции.
Чтобы обсуждать/осуждать перегрузку полезно понимать суть
диспетчеризации вообще, и по типам в частности.
В приводимой статье вообще нет слова dispatch, а есть Heroin и drug,
что выдает ее явно популистско-провокационный характер.
Уже при построении системы числовых типов,
integer->rational->float->complex, обычно называемой numeric-tower,
из-за линейной иерархии, мы сталкиваемся с необходимостью приведения
типов, и введении обобщенных операторов, диспетчеризации по типу.
Там приведено решение для динамической (в run-time) диспетчеризации по
типу, дан обзор _реальных_ проблем порождаемых арифметикой типов,
приведением и диспетчеризацией.
А если следовать логике автора — давайте заклеймим ветвление (if),
выбор (switch), и хеш таблицы — все же это можно использовать для
(о ужас!) диспетчеризации.
Итог: давайте спорить о приготовлении блюд, с тем кто умеет их
готовить.