laMer007
http://ideone.com/Ydig1M
Hardcode
Это частный случай. Холодно. Специализации бывают частичными. (Эх, слишком крупно подсказал...)
laMer007
http://ideone.com/Suf1m6
http://ideone.com/zrXUyM
Покажи хоть кусок кода, который не будет работать.
Hardcode
На счет первого
не отвечу точно. Мне и самому интересно. Но лезть в стандарт не хочу. Может кто знает? Ну кроме общих фраз типа есть способ лучше и его лучше использовать всегда вместо этого и того что было в нулевом коде
Второй код соответственно нельзя использовать. Это просто нарушение интерфейса и стандарта. В промышленном коде поэтому использовать его сомнительно. Его даже не обсуждаем.
И так первый код допустим разрешён, в чем я сомневаюсь, но это частный случай. Мы же говорим про общий. Допустим Foo<T1, T2>. Приведите код для подмены swap?
PS: Kartonagnick ниже почти всё испортил объяснил. (:
Вызываем оптимальную функцию, на примере std::swap и её специализации в разных пространствах имен.
laMer007
Вот стандарт:
[lib.reserved.names] 17.4.3.1 Reserved names
It is undefined for a C + + program to add declarations or definitions to namespacestdor namespaces
within namespace std unless otherwise specified. A program may add template specializations for any
standard library template to namespace std. Such a specialization (complete or partial) of a standard
library template results in undefined behavior unless the declaration depends on a user-defined name of
external linkage and unless the specialization meets the standard library requirements for the original tem
plate.
163)
Насчет второго кода, никто и не говорил, что он хороший :)
И мне хотелось бы увидеть пример "полезного" кода, который не попадает в первый вариант.
Kartonagnick
laMer007
Не могу сходу вспомнить, где свап юзается в стл, хотелось бы посмотреть, использует ли он using std::swap?
UPD: Я туплю, он и так находится в std неймспейсе, там не надо
Hardcode
> где свап юзается в стл
std::iter_swap. В #include <algorithm> в нескольких функциях должно быть как минимум. Но не поможет)
Kartonagnick
Это хороший способ, но мало кто пишет using std::swap. 50% пишут using namespace std и у них подцепится наша оптимизированная функция, 50% пишут std:: и у них она не подцепится.
Hardcode
> 50% пишут using namespace std
Хреново им.
Ну а вообще про std::swap Маерс нормально всё описал в своей "Эффективное использование C++".
Только вот о чем спор так и не понятно :)
MATov
Изначально спор был из-за этого:
Так делать не желательно. Как минимум возможная потеря производительности из-за std::. Это не шутка.
И теперь я таки вынужден согласиться, что существует небольшое количество случаев, когда лучше будет написать using std::swap; swap(value1, value2); чем просто std::swap.
Хотя я даже не уверен, о каких именно случаях говорил laMer007
Hardcode
> Хотя я даже не уверен, о каких именно случаях говорил laMer007
Напишите код swap для Foo<T1, T2>.
Hardcode
> Хотя я даже не уверен, о каких именно случаях говорил laMer007
В тех случаях, когда для класса определен свой swap внутри класса, эффективный и специфичный для него, что бы не делать тупого копирования.
laMer007
Сойдет и Foo<T1>
Hardcode
> Сойдет и Foo<T1>
Здесь содержится, я так понимаю, ещё и ответ на мой вопрос относительно первого вашего кода для тех кому не лень лезть в стандарт?
Тема в архиве.