thedeemon: (office)
[personal profile] thedeemon
Микола, бачив як С++ники xs.writeln пишуть?
std::copy(std::begin(xs), std::end(xs), std::ostream_iterator<unsigned char>(std::cout));
std::cout << std::endl;

навеяно
Page 1 of 3 << [1] [2] [3] >>

Date: 2015-10-16 06:40 am (UTC)
From: [identity profile] levgem.livejournal.com
повбыбав бы

Date: 2015-10-16 06:52 am (UTC)
From: [identity profile] nivanych.livejournal.com
Но может быть, в новом C++ это будет ещё красивее!

Date: 2015-10-16 07:00 am (UTC)
From: [identity profile] yauheni akhotnikau (from livejournal.com)
Это как раз в новом. Функции std::begin/std::end были включены в стандарт в C++11.

Date: 2015-10-16 07:02 am (UTC)
From: [identity profile] yauheni akhotnikau (from livejournal.com)
Так C++ники так еще со времен C++98 пишут, уже лет 17 как :)

Date: 2015-10-16 07:07 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Ну да. Но если в 2015 году это по-прежнему идиоматичный и правоверный способ, это.. впечатляет.

Date: 2015-10-16 07:09 am (UTC)
From: [identity profile] nivanych.livejournal.com
Я про грядущий 16-й.
Ничего про него не знаю, "есличо".

Date: 2015-10-16 07:10 am (UTC)
From: [identity profile] nivanych.livejournal.com
С++, это уникальная вещь.
Много, чему там можно поражаться ;-)

Date: 2015-10-16 07:12 am (UTC)
From: [identity profile] yauheni akhotnikau (from livejournal.com)
А что, в D функция writeln автоматически реализуется для любого типа? ;)

Date: 2015-10-16 07:18 am (UTC)
From: [identity profile] yauheni akhotnikau (from livejournal.com)
Грядущий будет 17-й.

Вообще, этому приему уже лет двадцать, наверное. Он точно доступен с C++98. Смысл в том, что если есть произвольный поддиапазон [a,b), то его содержимое можно отправить в cout посредством поэлементного копирования, где вместо "приемника" задается не непосредственно cout, а завязанный на cout итератор.

В принципе, любой может написать для себя шаблон writeln, который будет получать аргументом [a,b) и прятать copy у себя внутри. Но в стандартной библиотеке такой функции нет.

Date: 2015-10-16 07:26 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Автоматически для любого выглядящего как range. Как в вашем посте, где begin и end были определены.
И для многих других тоже автоматически работает (всех структур, например).
Edited Date: 2015-10-16 07:29 am (UTC)

Date: 2015-10-16 07:33 am (UTC)
From: [identity profile] yauheni akhotnikau (from livejournal.com)
Можно только порадоваться за D, где этому уделяют столько внимания.

Date: 2015-10-16 07:41 am (UTC)
develop7: (dero)
From: [personal profile] develop7
во-первых, RSI придумали то ли тру́сы, то ли жидорептилоиды; во-вторых, есть же макросы!

Date: 2015-10-16 07:57 am (UTC)
From: [identity profile] yauheni akhotnikau (from livejournal.com)
Во-первых, про этот трюк с std::copy и std::ostream я узнал лет 15 назад, с тех пор использовал раза три или четыре и ни разу не в продакшене.
Во-вторых, маросы -- это вы с C или Rust-ом перепутали. В C++ есть шаблоны, на которых благопристойный writeln пишется с полпинка. Только вот, как показывает история, в стандарте он пока никому не понадобился.

Date: 2015-10-16 08:20 am (UTC)
From: [identity profile] zeit-raffer.livejournal.com
Язык делают люди. Так что это не язык странный, а люди, которые его делают. Почему они не сделали что-то вроде cout << xs? А им Заратустра не позволяет!

Date: 2015-10-16 08:21 am (UTC)
From: [identity profile] nivanych.livejournal.com
Да я не про этот приём.
А про гипотетические новые красивые приёмы! ;-)

Date: 2015-10-16 08:24 am (UTC)
From: [identity profile] nivanych.livejournal.com
Вот видел же Влад тов. Страуструпа на какой-то конференции, но постеснялся спросить про монады в C++ ;-)

Date: 2015-10-16 08:30 am (UTC)
From: [identity profile] theiced.livejournal.com
ну потому что "стандарт" (я не могу без кавычек писать про документ в котором сотни undefined behavior) "пишут" (в кавычках потому что хуем) пидорасы (без кавычек).

Date: 2015-10-16 08:32 am (UTC)
From: [identity profile] yauheni akhotnikau (from livejournal.com)
В стандартной библиотеке C++ очень много чего нет. Как и в самом языке. Насколько я понимаю, до C++11 не было возможности написать шаблонную функцию writeln, которой можно было бы пользоваться вот так: writeln(cout,xs). В C++11, насколько я понимаю, это уже можно сделать даже без танцев с бубнами.

Date: 2015-10-16 08:33 am (UTC)
From: [identity profile] sasha-gil.livejournal.com
должно быть что-то вроде

for (auto&& a: xs) std::cout << a;
std::cout << std::endl;

ну не мега-красиво, но всё же более читабельно; '&&' это пижонство, в простых случаях ненужное (но полезное, если тип xs в этом месте не вполне ясен)
Edited Date: 2015-10-16 08:35 am (UTC)

Date: 2015-10-16 08:34 am (UTC)
From: [identity profile] yauheni akhotnikau (from livejournal.com)
Вы твердо уверены в том, что operator<< для любых xs должен быть определен в стандарте?

Date: 2015-10-16 08:44 am (UTC)
From: [identity profile] zeit-raffer.livejournal.com
Тут же не любые xs. Тут те, для которых осмысленен процитированный фрагмент кода.
Конечно, такой подход приводит к другому ужасу - у классов в стандартной библиотеке может быть по тысяче методов, если мы пытаемся засунуть туда все подобное...

Date: 2015-10-16 08:49 am (UTC)
From: [identity profile] yauheni akhotnikau (from livejournal.com)
Может тогда лучше было бы заглянуть по ссылке и разобраться, к чему относиться процитированный код? Там же xs как раз произвольный пользовательский тип, который выставляет наружу методы begin и end.

Ничего не мешает сделать для типа file_mapped_memory (экземпляр которого и понимается под xs) определить свой собственный operator<<. И было бы как раз так, как вы бы хотели: cout << x.
А уже внутри этого operator<< могло быть как использование std::copy, так и что-то другое, более эффективное.
Только для нужд конкретного мелкого примера делать operator<< для file_mapped_memory смысла не было.

Тем не менее, вопрос не снят: вы действительно считаете, что в стандарте C++ должен быть operator<< для любого пользовательского типа?

Date: 2015-10-16 08:52 am (UTC)
From: [identity profile] zeit-raffer.livejournal.com
Я даже примечание видел, что-что вроде "мы разрабатываем концепты совсем не для того, чтобы потом использовать их для всякой хуеты вроде монад, а для бла-бла-бла..." - но мы-то понимаем, что люди потом будут делать на них именно монады.

Date: 2015-10-16 09:00 am (UTC)
From: [identity profile] zeit-raffer.livejournal.com
Еще раз - не для любого вообще.
А для типа с begin и end.
А Вы так не считаете?
Людям, далеким от идиоматики С++, сама идея везде, где мы пользуемся списком (или чем-то, похожим на список), дописывать begin и end, - кажется странной. Есть такой термин "синтаксический мусор".

Date: 2015-10-16 09:12 am (UTC)
From: [identity profile] nivanych.livejournal.com
Воот! А некоторые тут поклёп устраивают, показывая всякие некрасивые варианты!!
Page 1 of 3 << [1] [2] [3] >>

Profile

thedeemon: (Default)
Dmitry Popov

December 2025

S M T W T F S
 12 3456
789101112 13
14151617181920
21222324252627
28293031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 31st, 2026 06:43 am
Powered by Dreamwidth Studios