Templates
От: smeeld  
Дата: 02.07.18 11:42
Оценка: -1 :)
Заметил, что у большинства практикующих C++ достаточно негативное отношение к шаблонам в CPP. Речь идёт не о использовании std или boost, которые состоят из таковых процентов на 80, а о написании кода с активным применением параметризации функций и типов. Это многими считается чуть ли не признаком недостатка квалификации, типа матёрый плюсовик всегда найдёт способ расписать без создания параметризованных типов, и вообще найдёт способ писать на C++ как можно проще. Это вообще что такое? Если принять это мнение за справедливое, то получается, что std и boost писали джуны несмышлённые и не знающие как просто писать на CPP?
Re: Templates
От: niXman Ниоткуда https://github.com/niXman
Дата: 02.07.18 11:45
Оценка: +2
Здравствуйте, smeeld, Вы писали:

S>Заметил, что у большинства практикующих C++ достаточно негативное отношение к шаблонам в CPP. Речь идёт не о использовании std или boost, которые состоят из таковых процентов на 80, а о написании кода с активным применением параметризации функций и типов. Это многими считается чуть ли не признаком недостатка квалификации, типа матёрый плюсовик всегда найдёт способ расписать без создания параметризованных типов, и вообще найдёт способ писать на C++ как можно проще.

впервые такое слышу =)

S>Это вообще что такое?

выдавание желаемого за действительное
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re: Templates
От: lpd Черногория  
Дата: 02.07.18 11:52
Оценка: +3 -1
Здравствуйте, smeeld, Вы писали:

S>Заметил, что у большинства практикующих C++ достаточно негативное отношение к шаблонам в CPP.

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

S>Это вообще что такое? Если принять это мнение за справедливое, то получается, что std и boost писали джуны несмышлённые и не знающие как просто писать на CPP?

Для меня язык программирования — это только инструмент, который должен быть простым, а возможностей классического C++(с умеренными шаблонами) мне достаточно. Должен сказать, что Александреску и прочих фанатиков почти никогда не читал, т.к. не нравится лес из скобочек.
Кому-то нравится компиляторы писать, кому-то базы данных. Мне все это скучно, и нравится заниматься низкоуровневым кодом на C. Так получилось, что в комитете C++ засилье любителей языков программирования как искусства, а не практиков — и они выпускают новые стандарты C++ с новыми фичами шаблонов.
У сложных вещей обычно есть и хорошие, и плохие аспекты.
Берегите Родину, мать вашу. (ДДТ)
Отредактировано 02.07.2018 11:57 lpd . Предыдущая версия . Еще …
Отредактировано 02.07.2018 11:54 lpd . Предыдущая версия .
Отредактировано 02.07.2018 11:53 lpd . Предыдущая версия .
Re: Templates
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 02.07.18 11:55
Оценка: +4 -1
Здравствуйте, smeeld, Вы писали:

S>Это многими считается чуть ли не признаком недостатка квалификации, типа матёрый плюсовик всегда найдёт способ расписать без создания параметризованных типов, и вообще найдёт способ писать на C++ как можно проще.

Всё наооборот. Если плюсовик не умеет использовать шаблоны, то он неквалифицирован.
Sic luceat lux!
Re[2]: Templates
От: lpd Черногория  
Дата: 02.07.18 11:58
Оценка: +1 -1
Здравствуйте, Kernan, Вы писали:

K>Всё наооборот. Если плюсовик не умеет использовать шаблоны, то он неквалифицирован.


Можно привести большой список того, что нужно уметь квалифицированному программисту, и в нем будет множество гораздо более важных вещей, чем шаблоны или C++17.
У сложных вещей обычно есть и хорошие, и плохие аспекты.
Берегите Родину, мать вашу. (ДДТ)
Re: Templates
От: koenig  
Дата: 02.07.18 12:02
Оценка:
S>Заметил, что у большинства практикующих C++ достаточно негативное отношение к шаблонам в CPP. Речь идёт не о использовании std или boost, которые состоят из таковых процентов на 80, а о написании кода с активным применением параметризации функций и типов. Это многими считается чуть ли не признаком недостатка квалификации, типа матёрый плюсовик всегда найдёт способ расписать без создания параметризованных типов, и вообще найдёт способ писать на C++ как можно проще. Это вообще что такое? Если принять это мнение за справедливое, то получается, что std и boost писали джуны несмышлённые и не знающие как просто писать на CPP?

лет так под 25 назад плюсовые компиляторы плохо работали с шаблонами
это нанесло глубокую душевную травму программистам тех времен, и они шаблоны избегали
я уже больше 15 лет на них ничего не писал, и к тому времени когда я их забросил — с шаблонами всё там было хорошо (ну разве что сообщения об ошибках суровые)
это либо динозавры, либо люди покусанные динозаврами
Re[3]: Templates
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 02.07.18 12:05
Оценка:
Здравствуйте, lpd, Вы писали:

lpd>Можно привести большой список того, что нужно уметь квалифицированному программисту, и в нем будет множество гораздо более важных вещей, чем шаблоны или C++17.

Мы говорим о практикующем программисте на С++, а не сферическом программисте в вакууме.
Sic luceat lux!
Re: Templates
От: kov_serg Россия  
Дата: 02.07.18 12:07
Оценка: 6 (1) +3
Здравствуйте, smeeld, Вы писали:

S>Заметил, что у большинства практикующих C++ достаточно негативное отношение к шаблонам в CPP. Речь идёт не о использовании std или boost, которые состоят из таковых процентов на 80, а о написании кода с активным применением параметризации функций и типов.

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

S>Это многими считается чуть ли не признаком недостатка квалификации, типа матёрый плюсовик всегда найдёт способ расписать без создания параметризованных типов, и вообще найдёт способ писать на C++ как можно проще. Это вообще что такое?

Это везде так, человек который знает как оно должно быть и где разложены грабли может написать проще и короче, чем тот кто с такой задаче сталкивается в первые.

S>Если принять это мнение за справедливое, то получается, что std и boost писали джуны несмышлённые и не знающие как просто писать на CPP?

Если в ваше логической цепочке получается противоречие значит исходные предположения скорее всего не верны.
Re[4]: Templates
От: lpd Черногория  
Дата: 02.07.18 12:14
Оценка: 1 (1) +3 -3 :)
Здравствуйте, Kernan, Вы писали:

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


lpd>>Можно привести большой список того, что нужно уметь квалифицированному программисту, и в нем будет множество гораздо более важных вещей, чем шаблоны или C++17.

K>Мы говорим о практикующем программисте на С++, а не сферическом программисте в вакууме.

Как раз логика 'лучший программист лучше знает язык программирования' звучит несколько сферично. А на практике практикующий программист C++ получит больше от изучения баз данных, устройства ОС и электроники, скриптовых языков, или других технологий. А когда он это изучит, для проекта будет важнее архитектура кода, который он пишет, чем использование сложных шаблонов или других фич C++17.
Для программиста C++ главное вовсе не C++.
У сложных вещей обычно есть и хорошие, и плохие аспекты.
Берегите Родину, мать вашу. (ДДТ)
Re: Templates
От: Qbit86 Кипр
Дата: 02.07.18 12:24
Оценка: 1 (1) +6 :)
Здравствуйте, smeeld, Вы писали:

S>Это вообще что такое?


Речь идёт о трёх стадиях владения шаблонами: не уметь использовать, уметь использовать, уметь не использовать.

S>получается, что std и boost писали джуны несмышлённые и не знающие как просто писать на CPP?


Авторы STL и Boost находятся, конечно, на третьей стадии. Просто они пишут библиотеки повторно используемого кода. Они должны быть обобщёнными и гибкими в ущерб другим характеристикам. Для прикладного кода важнее простота понимания и поддержки кодобазы. Например, когда движок игры написан на float'ах, а не на параметризованных типах, обмазанных трейтами и тайпдефами для параметров шаблона. Или когда для полиморфизма используют простые виртуальные функции с динамичекой диспетчеризацией, а не CRTP-подобные конструкции ради статической диспетчеризации.
Глаза у меня добрые, но рубашка — смирительная!
Re[2]: Templates
От: smeeld  
Дата: 02.07.18 13:22
Оценка:
Здравствуйте, Qbit86, Вы писали:

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


S>>Это вообще что такое?


Q>Речь идёт о трёх стадиях владения шаблонами: не уметь использовать, уметь использовать, уметь не использовать.


Не стоит тот прикол, придуманный касательно индексов SQL БД, (не знать, что нужно, знать что нужно и знать когда не нужно) распространять на плюсы. Использование шаблонов жутко удобно, в том числе и для упомянутой Вами возможности повторного использования кода (а это бывает необходимым чуть более чем всегда, не только лишь при разработке сущностей STD), также замечательно когда нет необходимости привязываться к конкретным типам, где-то определяемым и описываемым-ты просто вводишь парвметр, за которым может стоять что угодно и пр. подобное. Это жутко удобно. То самое "умение не использовать шаблоны"-это проще чем их использовать, естественно, так что это не есть скил, больший чем умение использовать шаблоны. Вот только решение не использовать шаблоны чаще всего появляется именно вследствии того самого господствующего негативного отношения к шаблонам и ничем больше.
Re[3]: Templates
От: Qbit86 Кипр
Дата: 02.07.18 13:55
Оценка: 6 (1) +2
Здравствуйте, smeeld, Вы писали:

S>ты просто вводишь парвметр, за которым может стоять что угодно и пр. подобное. Это жутко удобно.


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

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


Или наоборот: решение использовать шаблоны появляется вследствие желания выпендриться, а не оптимально решить задачу.
Глаза у меня добрые, но рубашка — смирительная!
Re[4]: Templates
От: smeeld  
Дата: 02.07.18 14:05
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>Нельзя просто так взять и ввести параметр, за которым может стоять что угодно. У ограниченного полиморфизма важны э-э-э... ограничения.


Понятно, что у того чего угодно должны быть строго определённые методы, но в остальном это действительно что угодно.

Q>Или наоборот: решение использовать шаблоны появляется вследствие желания выпендриться.


А если это тупо удобно?
Re[5]: Templates
От: XuMuK Россия  
Дата: 03.07.18 09:44
Оценка: +4
Здравствуйте, lpd, Вы писали:

lpd>Как раз логика 'лучший программист лучше знает язык программирования' звучит несколько сферично. А на практике практикующий программист C++ получит больше от изучения баз данных, устройства ОС и электроники, скриптовых языков, или других технологий. А когда он это изучит, для проекта будет важнее архитектура кода, который он пишет, чем использование сложных шаблонов или других фич C++17.

lpd>Для программиста C++ главное вовсе не C++.

Все это надо знать программисту на любом языке, и ортогонально знанию С++. Исходный тезис о том, что программист С++ не знающий шаблоны неквалифицирован, от рассуждений о БД и ОС не меняется.
Re[6]: Templates
От: lpd Черногория  
Дата: 03.07.18 10:47
Оценка: -3
Здравствуйте, XuMuK, Вы писали:

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


lpd>>Для программиста C++ главное вовсе не C++.


XMK>Все это надо знать программисту на любом языке, и ортогонально знанию С++. Исходный тезис о том, что программист С++ не знающий шаблоны неквалифицирован, от рассуждений о БД и ОС не меняется.


"Програмист C++" — это термин из текстов вакансий. Звучит как 'инженер Autocad 15.0' или 'художник Photoshop': можно досконально знать Autocad, но ничего не понимать в технике. При этом польза от тонкостей Autocad может и есть, а вот в современном C++ многие фичи я бы ставил под сомнение.
У сложных вещей обычно есть и хорошие, и плохие аспекты.
Берегите Родину, мать вашу. (ДДТ)
Re: Templates
От: chaotic-kotik  
Дата: 04.07.18 06:38
Оценка: 1 (1) +3
Здравствуйте, smeeld, Вы писали:

S>Заметил, что у большинства практикующих C++ достаточно негативное отношение к шаблонам в CPP. Речь идёт не о использовании std или boost, которые состоят из таковых процентов на 80, а о написании кода с активным применением параметризации функций и типов. Это многими считается чуть ли не признаком недостатка квалификации, типа матёрый плюсовик всегда найдёт способ расписать без создания параметризованных типов, и вообще найдёт способ писать на C++ как можно проще.


Матерый плюсовик пишет не для удобства написания, а для удобства последующего чтения и поддержки.
Я очень часто встречал ситуации, когда тип параметризован, из-за этого код живет в *.h, любое его изменение приводит к перекомпиляции половины приложения, clang analyzer не кажет баги, в IDE не работает автодополнение. При этом всегда используется один и тот же параметр! На вопрос — а чО так, разработчик отвечает — а вдруг потом нужно будет? Преждевременная генерализация, это как преждевременная эякуляция, только хуже, т.к. за последнее не уволняют с работы.
Re: Templates
От: chaotic-kotik  
Дата: 04.07.18 06:48
Оценка:
Здравствуйте, smeeld, Вы писали:

S>Если принять это мнение за справедливое, то получается, что std и boost писали джуны несмышлённые и не знающие как просто писать на CPP?


Есть еще такая тема, что разработчик начинает пихать кругом шаблоны для оптимизации. Пример, есть метод Foo::bar(int c), при этом с — константа, в коде везде вызывается как-то так — "foo.bar(CONST_VAL)". Чувак оптимизирует, делая Foo — шаблоном типа template<int C> Foo ...; На самом деле это булшит, т.к. благодаря constant propagation и инлайнингу, оба варианта отличаться не будут, ничего в метод передаваться не будет в обоих случаях.
Re[2]: Templates
От: night beast СССР  
Дата: 04.07.18 06:53
Оценка: +1
Здравствуйте, chaotic-kotik, Вы писали:

S>>Если принять это мнение за справедливое, то получается, что std и boost писали джуны несмышлённые и не знающие как просто писать на CPP?


CK>Есть еще такая тема, что разработчик начинает пихать кругом шаблоны для оптимизации. Пример, есть метод Foo::bar(int c), при этом с — константа, в коде везде вызывается как-то так — "foo.bar(CONST_VAL)". Чувак оптимизирует, делая Foo — шаблоном типа template<int C> Foo ...; На самом деле это булшит, т.к. благодаря constant propagation и инлайнингу, оба варианта отличаться не будут, ничего в метод передаваться не будет в обоих случаях.



более глупый пример трудно придумать...
Re[2]: Templates
От: T4r4sB Россия  
Дата: 04.07.18 08:22
Оценка: +1
Здравствуйте, Kernan, Вы писали:

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


S>>Это многими считается чуть ли не признаком недостатка квалификации, типа матёрый плюсовик всегда найдёт способ расписать без создания параметризованных типов, и вообще найдёт способ писать на C++ как можно проще.

K>Всё наооборот. Если плюсовик не умеет использовать шаблоны, то он неквалифицирован.
Только чтоб считаться гуру, то помимо умения использования шаблонов нужно ещё умение неиспользования шаблонов.
Re[3]: Templates
От: smeeld  
Дата: 04.07.18 08:52
Оценка:
Здравствуйте, night beast, Вы писали:

NB>

NB>более глупый пример трудно придумать...

Это типичный довод нелюбителя шаблонов.
Re[2]: Templates
От: smeeld  
Дата: 04.07.18 08:56
Оценка:
Здравствуйте, chaotic-kotik, Вы писали:

CK>Матерый плюсовик пишет не для удобства написания, а для удобства последующего чтения и поддержки.


Тогда весь boost и gnu stl писали не матёрые плюсовики?
Re[3]: Удобство чтения и поддержки
От: Qbit86 Кипр
Дата: 04.07.18 09:06
Оценка: +1
Здравствуйте, smeeld, Вы писали:

CK>>...а для удобства последующего чтения и поддержки.


S>Тогда весь boost и gnu stl...


Весь Boost и Stl, очевидно, к удобству чтения и поддержки не имеют никакого отношения. Достаточно заглянуть в их исходники, что там скрыто за более или менее причёсанным фасадом.
Глаза у меня добрые, но рубашка — смирительная!
Re: Templates
От: ksandro Мухосранск  
Дата: 04.07.18 09:15
Оценка: +4
Здравствуйте, smeeld, Вы писали:

S>Заметил, что у большинства практикующих C++ достаточно негативное отношение к шаблонам в CPP. Речь идёт не о использовании std или boost, которые состоят из таковых процентов на 80, а о написании кода с активным применением параметризации функций и типов. Это многими считается чуть ли не признаком недостатка квалификации, типа матёрый плюсовик всегда найдёт способ расписать без создания параметризованных типов, и вообще найдёт способ писать на C++ как можно проще. Это вообще что такое? Если принять это мнение за справедливое, то получается, что std и boost писали джуны несмышлённые и не знающие как просто писать на CPP?


Вообще тут проблема не в шаблонах и даже не С++, проблема в страсти многих программистов к абстракции и обобщению, в желании решить более обобщенную задачу чем требуется. Так бало с ООП, когда народ часто на пустом месте городил разветвленную 10-уровневую иерархию классов. Так было с паттернами, когда в код засовывали паттерны, просто потому, что недавно прочитали книгу по паттернам, и круто было бы где-нибудь какой-нибудь паттерн применить.

Шаблоны, обладают большой мощью и дают программисту огромное поле для обобщения и параметризации. И неокрепшие умы, повторяя мантру про избавление от copy/paste и повторное использование кода, начинают обобщать и параметризовать все, что можно и нельзя, просто потому-что могут. Крутой профессионал, как раз тот, кто может найти места, где нужно обобщать и параметризовывать, а где copy/paste нескольких строчек будет самым лучщим и простым решением.
Re[4]: Удобство чтения и поддержки
От: smeeld  
Дата: 04.07.18 09:19
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>Весь Boost и Stl, очевидно, к удобству чтения и поддержки не имеют никакого отношения. Достаточно заглянуть в их исходники, что там скрыто за более или менее причёсанным фасадом.


О чём и говорю, почему разрабы gnu stl и boost не использовали навыки "написания чтоб понятно бУло" и навыки "неиспользования шаблонов"? И не надо что там иначе нельзя было. В либах Boost, которых просматривал, имеется куча мест, где можно было бы обойтись без шаблонов. Там всё на шаблонах по ряду причин. Читабельность кода авторов не волнует, так как знают, что плюсовики их уровня поймут код без проблем, а всякие квалифицированные умеющие неписать на шаблонах пусть идут лесом.
Re[5]: Удобство чтения и поддержки
От: Qbit86 Кипр
Дата: 04.07.18 09:32
Оценка: +3
Здравствуйте, smeeld, Вы писали:

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


Ты путаешь такие активности как использование библиотеки и изменения её внутренностей. Авторы Буста жертвовали удобством второй активности ради удобства первой. «Плюсовикам их уровня» точно так же гораздо тяжелее понимать шаблонный код, чем обычный.
Глаза у меня добрые, но рубашка — смирительная!
Re[2]: Templates
От: smeeld  
Дата: 04.07.18 10:16
Оценка:
Здравствуйте, ksandro, Вы писали:

где copy/paste нескольких строчек будет самым лучщим и простым решением.

Ну, этот тред не про копипасту пары строчек, а про расписывание систем с введением обобщёний и без
Re: Templates
От: so5team https://stiffstream.com
Дата: 04.07.18 11:46
Оценка: +2 :))
Здравствуйте, smeeld, Вы писали:

S>Заметил, что у большинства практикующих C++ достаточно негативное отношение к шаблонам в CPP.


Хорошо бы пруфов. И про негативное. И, в особенности, про большинство.

S>Это многими считается чуть ли не признаком недостатка квалификации, типа матёрый плюсовик всегда найдёт способ расписать без создания параметризованных типов, и вообще найдёт способ писать на C++ как можно проще.


Ну вот, схематически из совсем свежего:
struct successful_result_t { ... };
struct failed_result_t { ... };

struct reply_t {
  request_id_t id_;
  worker_id_t worker_;
  std::variant<successful_result_t, failed_result_t> result_;

  template<typename Actual_Result>
  reply_t(request_id_t id, worker_id_t worker, Actual_Result && result)
    : id_{std::move(id)}, worker_{std::move(worker)}
    , result_{std::forward<Actual_Result>(result)}
  {}
};

Позволяет использовать один и тот же конструктор и для
return reply_t{id, self, successful_result_t{...}};

и для
return reply_t{id, self, failed_result_t{...}};

И останется таковым даже если список результатов расширится, например, когда добавятся overloaded_result_t, postponed_result_t и пр. Не говоря уже о том, что сам по себе std::variant и средства работы с ним -- это сплошная шаблонная магия.

Вы вместе с вашими матерыми C++ разработчиками вместо этого предлагаете что?
Re[2]: Templates
От: smeeld  
Дата: 04.07.18 11:58
Оценка:
Здравствуйте, so5team, Вы писали:

S>Вы вместе с вашими матерыми C++ разработчиками вместо этого предлагаете что?


Я то как раз за, если случается писать на С++ то ухожу в шаблоны сразу, без них код на С++ нелаконичен и убог, откровенно говоря. В треде упоминались те, кто против, кто желает писать на C++ как на Си, так как писать на С++ без шаблонов-это и означает писать на Си. Кстати, многие из противников в треде уже отметились, почитайте их доводы против параметризации и обобщений, типа это выпендрёшь м нечитабельно.
Re[3]: Templates
От: ksandro Мухосранск  
Дата: 04.07.18 12:03
Оценка: +5
Здравствуйте, smeeld, Вы писали:

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


S> где copy/paste нескольких строчек будет самым лучщим и простым решением.


S>Ну, этот тред не про копипасту пары строчек, а про расписывание систем с введением обобщёний и без


Как правило на практике аццкие иерархии классов, шаблонов, стратегий, или еще чего-то там, как раз возникают когда народ пытается любой ценой избавится от каждой копипасты под лозунгом "любое дублирование кода — абсолютное зло!".

Тут нужно иметь некоторое чутье, когда обобщение действителько упрощает код и помогает работе, а когда наоборот только все загромождает и мешает. И это чутье — очень редкий скил, им мало кто обладает в том числе среди опытных людей.
Re[3]: Templates
От: so5team https://stiffstream.com
Дата: 04.07.18 12:04
Оценка: +3
Здравствуйте, smeeld, Вы писали:

S>Кстати, многие из противников в треде уже отметились, почитайте их доводы против параметризации и обобщений, типа это выпендрёшь м нечитабельно.


Нормальных аргументов пока замечено не было, что неудивительно.
Re[2]: Templates
От: chaotic-kotik  
Дата: 04.07.18 12:23
Оценка:
Здравствуйте, so5team, Вы писали:


S>Ну вот, схематически из совсем свежего:

S>
struct successful_result_t { ... };
S>struct failed_result_t { ... };

S>struct reply_t {
S>  request_id_t id_;
S>  worker_id_t worker_;
S>  std::variant<successful_result_t, failed_result_t> result_;

S>  template<typename Actual_Result>
S>  reply_t(request_id_t id, worker_id_t worker, Actual_Result && result)
S>    : id_{std::move(id)}, worker_{std::move(worker)}
S>    , result_{std::forward<Actual_Result>(result)}
S>  {}
S>};

S>Позволяет использовать один и тот же конструктор и для
S>
return reply_t{id, self, successful_result_t{...}};

S>и для
S>
return reply_t{id, self, failed_result_t{...}};


по твоему это активное применение шаблонов? :D

S>И останется таковым даже если список результатов расширится, например, когда добавятся overloaded_result_t, postponed_result_t и пр. Не говоря уже о том, что сам по себе std::variant и средства работы с ним -- это сплошная шаблонная магия.


если добавится overloaded_result тебе прийдется добавить его в variant, т.е. поменять свой класс reply_t, если бы твой к-тор сразу принимал variant то не потребовался бы шаблон и поменять список ответов, которые может принимать reply_t можно было бы в одном месте, там где определен тип этого std::variant, можно было бы вынести реализацию в cpp
Re[3]: Templates
От: so5team https://stiffstream.com
Дата: 04.07.18 12:33
Оценка:
Здравствуйте, chaotic-kotik, Вы писали:

CK>по твоему это активное применение шаблонов? :D


Это пример того, как шаблоны всплыли там, где изначально даже не были видны. И, что характерно, такое случается регулярно.
Re[2]: Templates
От: alpha21264 СССР  
Дата: 04.07.18 12:47
Оценка:
Здравствуйте, so5team, Вы писали:

S>Ну вот, схематически из совсем свежего:

S>
struct successful_result_t { ... };
S>struct failed_result_t { ... };

S>struct reply_t {
S>  request_id_t id_;
S>  worker_id_t worker_;
S>  std::variant<successful_result_t, failed_result_t> result_;

S>  template<typename Actual_Result>
S>  reply_t(request_id_t id, worker_id_t worker, Actual_Result && result)
S>    : id_{std::move(id)}, worker_{std::move(worker)}
S>    , result_{std::forward<Actual_Result>(result)}
S>  {}
S>};

S>Позволяет использовать один и тот же конструктор и для
S>
return reply_t{id, self, successful_result_t{...}};

S>и для
S>
return reply_t{id, self, failed_result_t{...}};

S>И останется таковым даже если список результатов расширится, например, когда добавятся overloaded_result_t, postponed_result_t и пр. Не говоря уже о том, что сам по себе std::variant и средства работы с ним -- это сплошная шаблонная магия.

S>Вы вместе с вашими матерыми C++ разработчиками вместо этого предлагаете что?


struct result_t
{
   bool successful ;
   ...
}


Не надо сочинять сущности без необходимости.
За это раньше жгли на костре.

Или даже так:
struct result_t { ... };

// в случае ошибки
throw -1 ; // тогда тебе просто не нужны данные failed_result_t


Течёт вода Кубань-реки куда велят большевики.
Отредактировано 04.07.2018 12:51 alpha21264 . Предыдущая версия .
Re[3]: Templates
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 04.07.18 13:04
Оценка:
Здравствуйте, alpha21264, Вы писали:

A>// в случае ошибки

A>throw -1 ; // тогда тебе просто не нужны данные failed_result_t
A>[/code]
A>
Сомневаюсь что сработает. Очевидно, что реализация на кодах возврата тут делается чтобы избежать проблем с исключениями в многопоточной среде.
Sic luceat lux!
Re[4]: Templates
От: alpha21264 СССР  
Дата: 04.07.18 13:09
Оценка:
Здравствуйте, Kernan, Вы писали:

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


A>>// в случае ошибки

A>>throw -1 ; // тогда тебе просто не нужны данные failed_result_t
A>>[/code]
A>>
K>Сомневаюсь что сработает. Очевидно, что реализация на кодах возврата тут делается чтобы избежать проблем с исключениями в многопоточной среде.

Ну это я прикололся, сам понимаешь (по -1 вместо нормальной структуры ошибки).

Течёт вода Кубань-реки куда велят большевики.
Re[4]: Templates
От: so5team https://stiffstream.com
Дата: 04.07.18 13:26
Оценка:
Здравствуйте, Kernan, Вы писали:

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


Нет. Реализация на кодах возврата делается потому, что и в случае успешной обработки запросов, и в случае неудачной обработки, есть полезная информация, которая должна быть донесена до места, где она может быть использована.

Многопоточность задействована, но в том смысле, что reply_t формируется на одном рабочем потоке и отсылается на другой рабочий поток для последующей работы с результатом.
Re[5]: Templates
От: AlexGin Беларусь  
Дата: 04.07.18 13:54
Оценка: +1
Здравствуйте, lpd, Вы писали:

lpd>Можно привести большой список того, что нужно уметь квалифицированному программисту, и в нем будет множество гораздо более важных вещей, чем шаблоны или C++17.


IMHO, cтранная точка зрения. Но твоё право — продолжать придерживаться ли её, или же прозреть...

lpd>Как раз логика 'лучший программист лучше знает язык программирования' звучит несколько сферично. А на практике практикующий программист C++ получит больше от изучения баз данных, устройства ОС и электроники...

В наше время есть понятие: разделение труда...

lpd>...когда он это изучит, для проекта будет важнее архитектура кода, который он пишет, чем использование сложных шаблонов или других фич C++17.

Фичи языка — это твои друзья, а НЕ враги!
Кстати, открою тебе маленький секрет — применение конструкции if constexpr из набора C++17 —
позволяет работать с шаблонами удобнее, чем раньше!!!
Вот простой пример:
template <typename C>
void print (const C &c)
{
    if constexpr (std::is_same_v<C, std::vector<int>>) {
        cout << "vector<int>: ";
    }

    if constexpr (std::is_same_v<C, std::list<int>>) {
        cout << "list<int>:   ";
    }

    if constexpr (std::is_same_v<C, std::deque<int>>) {
        cout << "deque<int>:  ";
    }

    for (auto i : c)
    {
        cout << i << ", ";
    }
    cout << '\n';
}

Архитектура кода — только выигрывает от применения современных возможностей языков программирования.
Так, применение приведенного выше метода, позволит тебе забыть о трудно-понимаемом SFINAE

lpd>Для программиста C++ главное вовсе не C++.

Хорошо, перефразирую твоё выражение так:
— Для хирурга — главное вовсе не умение оперировать.

...а теперь представь, что ты пациент именно этого врача...
Отредактировано 04.07.2018 14:07 AlexGin . Предыдущая версия . Еще …
Отредактировано 04.07.2018 14:03 AlexGin . Предыдущая версия .
Отредактировано 04.07.2018 13:58 AlexGin . Предыдущая версия .
Re[2]: Templates
От: Erop Россия  
Дата: 04.07.18 17:43
Оценка: +1
Здравствуйте, Kernan, Вы писали:

K>Всё наооборот. Если плюсовик не умеет использовать шаблоны, то он неквалифицирован.


И если не умеет использовать и если не умеет не использовать и даже если не умеет отличать случаи, когда надо использовать от случае, когда не надо
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: Templates
От: Erop Россия  
Дата: 04.07.18 17:57
Оценка:
Здравствуйте, so5team, Вы писали:

S>Это пример того, как шаблоны всплыли там, где изначально даже не были видны. И, что характерно, такое случается регулярно.


Это всего лишь означает, что ты не умеешь контролировать их "расползание" по коду...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: Templates
От: Erop Россия  
Дата: 04.07.18 18:02
Оценка: +1
Здравствуйте, so5team, Вы писали:

S>Вы вместе с вашими матерыми C++ разработчиками вместо этого предлагаете что?


Это, кстати, хорошее упражнение. Представить, что шаблонов нет, или что свои нельзя писать и подумать, как написать тоже самое без шаблонов.
Потом представить, что полиморфизм на уровне языка тоже не поддерживается, и придумать решение в стиле "Си с классами", ну а потом из трёх выбрать лучшее.

Попробуешь сам?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: Templates
От: so5team https://stiffstream.com
Дата: 04.07.18 19:06
Оценка:
Здравствуйте, Erop, Вы писали:

E>Попробуешь сам?


Лучше посмотреть, как шибко умные не зная контекста будут изобретать велосипед там, где простое, понятное и эффективное решение пишется с ходу в пару строчек.
Re[4]: Templates
От: Erop Россия  
Дата: 04.07.18 19:15
Оценка: +1
Здравствуйте, so5team, Вы писали:

S>Лучше посмотреть, как шибко умные не зная контекста будут изобретать велосипед там, где простое, понятное и эффективное решение пишется с ходу в пару строчек.


Ну так "шибко умные" это умеют, а у тебя, как раз, и знание контекста есть и тебе интересно, как без шаблонов сделать...

В частности есть такой вопрос по контексту, зачем вообще нужен result_t? Почему он сразу не вариант из удачного результата и неудачного?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[5]: Templates
От: so5team https://stiffstream.com
Дата: 04.07.18 19:55
Оценка:
Здравствуйте, Erop, Вы писали:

E>Ну так "шибко умные" это умеют


На словах все умеют.

E>В частности есть такой вопрос по контексту, зачем вообще нужен result_t?


Вы ошиблись, в приведенном примере нет сущностей с именем result_t.

E> Почему он сразу не вариант из удачного результата и неудачного?


Там и есть вариант из удачного и неудачного. Вот прям так иностранными буквами и написано: std::variant<successful_result_t, failed_result_t>.
Re[6]: Templates
От: Erop Россия  
Дата: 04.07.18 20:27
Оценка:
Здравствуйте, so5team, Вы писали:

S>Вы ошиблись, в приведенном примере нет сущностей с именем result_t.

Ну там у тебя много разных сущностей, и в вариантах ещё добавили. у тебя оно reply_t называлось.
Собственно вопрос чем reply от result отличается концептуально? И зачем их таки два разных?

E>> Почему он сразу не вариант из удачного результата и неудачного?


S>Там и есть вариант из удачного и неудачного. Вот прям так иностранными буквами и написано: std::variant<successful_result_t, failed_result_t>.


Там ещё много фсякого понаписано
Впрочем, как я понял, ты и так всё знаешь, к обсуждению не готов, так что зачем спрашивал у кого-то

Вы вместе с вашими матерыми C++ разработчиками вместо этого предлагаете что?

я не понимаю...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[7]: Templates
От: so5team https://stiffstream.com
Дата: 04.07.18 20:40
Оценка:
Здравствуйте, Erop, Вы писали:

E>Собственно вопрос чем reply от result отличается концептуально? И зачем их таки два разных?


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

E>Впрочем, как я понял


Это вряд ли.

E>так что зачем спрашивал у кого-то

Вы вместе с вашими матерыми C++ разработчиками вместо этого предлагаете что?

я не понимаю...


Да вот интересно посмотреть на решения от матерых программистов, застрявших в конце 1980-х. Но вряд ли доведется увидеть. Пока только пустые разговоры.
Re[8]: Templates
От: Erop Россия  
Дата: 04.07.18 21:39
Оценка: +1
Здравствуйте, so5team, Вы писали:

S>Да вот интересно посмотреть на решения от матерых программистов, застрявших в конце 1980-х. Но вряд ли доведется увидеть. Пока только пустые разговоры.


Ну вы хамите побольше
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: Templates
От: Barbar1an Украина  
Дата: 04.07.18 23:16
Оценка:
Здравствуйте, smeeld, Вы писали:

S>Заметил, что у большинства практикующих C++ достаточно негативное отношение к шаблонам в CPP. Речь идёт не о использовании std или boost, которые состоят из таковых процентов на 80, а о написании кода с активным применением параметризации функций и типов. Это многими считается чуть ли не признаком недостатка квалификации, типа матёрый плюсовик всегда найдёт способ расписать без создания параметризованных типов, и вообще найдёт способ писать на C++ как можно проще. Это вообще что такое? Если принять это мнение за справедливое, то получается, что std и boost писали джуны несмышлённые и не знающие как просто писать на CPP?


да всё там нормально, нужно просто меру знать и не параметризировать всё подряд

у меня в коде шабюлоны тока в контейнерах , эвентах и обвертках над сложными типами для устранения постоянных кастов и всё, и этого достаотчное
Я изъездил эту страну вдоль и поперек, общался с умнейшими людьми и я могу вам ручаться в том, что обработка данных является лишь причудой, мода на которую продержится не более года. (с) Эксперт, авторитет и профессионал из 1957 г.
Re[9]: Templates
От: so5team https://stiffstream.com
Дата: 05.07.18 05:00
Оценка: +1 -2
Здравствуйте, Erop, Вы писали:

S>>Да вот интересно посмотреть на решения от матерых программистов, застрявших в конце 1980-х. Но вряд ли доведется увидеть. Пока только пустые разговоры.


E>Ну вы хамите побольше


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

Это всего лишь означает, что ты не умеешь контролировать их "расползание" по коду...

и

Это, кстати, хорошее упражнение...Попробуешь сам?

у вас оказалась на удивление тонкая душевная организация.

А ведь результат разговора был предсказан точно: никакого кода. Только пустые разговоры вокруг стиля общения.

Это ведь вы когда-то рассказывали про мегабиблиотеку, которая многократно лучше STL, но которую никто не увидел и даже не узнал, на каких принципах она работает? Так что в вашем случае все предсказуемо.
Re[7]: Templates
От: night beast СССР  
Дата: 05.07.18 05:42
Оценка: +1
Здравствуйте, Erop, Вы писали:

E>Там ещё много фсякого понаписано

E>Впрочем, как я понял, ты и так всё знаешь, к обсуждению не готов, так что зачем спрашивал у кого-то

Вы вместе с вашими матерыми C++ разработчиками вместо этого предлагаете что?

я не понимаю...


если ты не готов предоставить код, который можно обсудить, то зачем было влезать?
Re[8]: Templates
От: chaotic-kotik  
Дата: 05.07.18 06:33
Оценка: +1
Здравствуйте, night beast, Вы писали:


NB>если ты не готов предоставить код, который можно обсудить, то зачем было влезать?


мой вариант он проигнорировал, так что, делаем выводы

ну и этот пример нельзя считать advanced применением шаблонов, идиоматичный perfect forwarding, ничего страшного и непонятного
Re[6]: Templates
От: chaotic-kotik  
Дата: 05.07.18 06:43
Оценка:
Здравствуйте, AlexGin, Вы писали:

AG>Фичи языка — это твои друзья, а НЕ враги!

AG>Кстати, открою тебе маленький секрет — применение конструкции if constexpr из набора C++17 —
AG>позволяет работать с шаблонами удобнее, чем раньше!!!
AG>Вот простой пример:
AG>
AG>template <typename C>
AG>void print (const C &c)
AG>{
AG>    if constexpr (std::is_same_v<C, std::vector<int>>) {
AG>        cout << "vector<int>: ";
AG>    }

AG>    if constexpr (std::is_same_v<C, std::list<int>>) {
AG>        cout << "list<int>:   ";
AG>    }

AG>    if constexpr (std::is_same_v<C, std::deque<int>>) {
AG>        cout << "deque<int>:  ";
AG>    }

AG>    for (auto i : c)
AG>    {
AG>        cout << i << ", ";
AG>    }
AG>    cout << '\n';
AG>}
AG>

AG>Архитектура кода — только выигрывает от применения современных возможностей языков программирования.
AG>Так, применение приведенного выше метода, позволит тебе забыть о трудно-понимаемом SFINAE

абсолютно синтетический пример, при этом а) все типы, которые ф-я поддерживают должны перечисляться внутри и б) std::vector<int, myalloc> уже не пройдет, я уже молчу про std::array
ну и я бы запилил такое на typeid::name и abi::__cxa_demangle (для gcc, clang)
Re[7]: Templates
От: niXman Ниоткуда https://github.com/niXman
Дата: 05.07.18 06:54
Оценка: +2
Здравствуйте, chaotic-kotik, Вы писали:

CK>ну и я бы запилил такое на typeid::name и abi::__cxa_demangle (для gcc, clang)


ужос
яваскриптщики в восторге =)
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[9]: Templates
От: so5team https://stiffstream.com
Дата: 05.07.18 07:05
Оценка:
Здравствуйте, chaotic-kotik, Вы писали:

CK>мой вариант он проигнорировал, так что, делаем выводы


А разве был какой-то вариант? Передача std::variant прямо в конструктор reply -- это так себе выбор. Поскольку хранение result-а именно в виде variant -- это, по сути, деталь реализации reply_t. Не есть хорошо, что эта деталь уже торчит наружу. Но прибивать к ней гвоздями еще и конструктор reply... Кому как, короче говоря.

CK>ну и этот пример нельзя считать advanced применением шаблонов, идиоматичный perfect forwarding, ничего страшного и непонятного


Этот пример достаточно компактен и понятен. Как раз то, что нужно для ленивого обсуждения на форуме. И то, даже аналог этого простого случая никто вменяемо не без шаблонов переписать не смог (ну нельзя же вот это
Автор: alpha21264
Дата: 04.07.18
воспринимать всерьез).

Можно было бы, конечно, какой-нибудь хардкор на публику вынести. Но тут ведь думать гораздо больше придется. В форумных войнах желание подумать у кого-нибудь -- это ну очень редкий зверь.
Re[7]: Templates
От: AlexGin Беларусь  
Дата: 05.07.18 07:39
Оценка:
Здравствуйте, chaotic-kotik, Вы писали:

CK>абсолютно синтетический пример, при этом а) все типы, которые ф-я поддерживают должны перечисляться внутри

Это совсем не обязательно: просто не будет аннотации к типу, а основной цикл всё равно — работать будет.

CK>б) std::vector<int, myalloc> уже не пройдет, я уже молчу про std::array

Я деже не припомню, когда я такое последний раз применял
Ну и это можно дополнить, если так уж хочется.

CK>ну и я бы запилил такое на typeid::name и abi::__cxa_demangle (для gcc, clang)

Дело вкуса

P.S. Несмотря на то, что пример действительно носит оттенок "синтетики", он позволяет скептикам (типа ТС), немного приоткрыть для себя C++17.
Отредактировано 05.07.2018 7:41 AlexGin . Предыдущая версия .
Re[9]: Templates
От: night beast СССР  
Дата: 05.07.18 07:40
Оценка:
Здравствуйте, chaotic-kotik, Вы писали:

NB>>если ты не готов предоставить код, который можно обсудить, то зачем было влезать?

CK>мой вариант он проигнорировал, так что, делаем выводы

и чем замена ссылки на вариант лучше исходного кода? (кроме добавления лишнего мува)
Отредактировано 05.07.2018 7:41 night beast . Предыдущая версия .
Re[3]: Box2D
От: Qbit86 Кипр
Дата: 05.07.18 08:33
Оценка: +3
Здравствуйте, smeeld, Вы писали:

S>Я то как раз за, если случается писать на С++ то ухожу в шаблоны сразу, без них код на С++ нелаконичен и убог, откровенно говоря. В треде упоминались те, кто против, кто желает писать на C++ как на Си, так как писать на С++ без шаблонов-это и означает писать на Си. Кстати, многие из противников в треде уже отметились, почитайте их доводы против параметризации и обобщений, типа это выпендрёшь м нечитабельно.


Подобное со стороны любителей Джавы можно услышать. Мол, почему вы вместо того, чтобы делом заниматься, пишете адаптеры абстрактных фабрик для декорации билдеров стратегий? А они тебе: да ты просто не осилил, так получается всё гибко и идиоматично.

Есть такой мужик, Erin Catto. Он создал самый популярный в мире движок 2D-физики. На С++. Чтобы создать качественную симуляцию, надо разбираться в том, как организовать детект коллизий, солвер контактов и констрейнтов, вычислительно устойчивую интеграцию, etc. Можно ли его назвать неквалифицированным программистом? А между тем там не то что шаблонов, там даже RAII толком нет, голый Си с классами и прости господи сырыми указателями, плюс-минус использование std::vector'а какого-нибудь. Зато движок легко читать и понимать, и можно не приходя в сознание портировать на любой JavaScript.

Вот, что автор пишет по этому поводу:

Why don't you use this awesome C++ feature?

Box2D is designed to be portable, so I try to keep the C++ usage simple. Also, I don't use the STL (except sort) or other libraries to keep the dependencies low. I keep template usage low and don't use name spaces. Remember, just because a C++ feature exists, that doesn't mean you need to use it.

The many ports of Box2D to other languages platforms shows that this strategy has been successful.


Писать с шаблонами любой горазд; я когда на C++ программировал, любил это делать. Но положа руку на сердце: если надо быстро въехать в кодобазу, гораздо приятнее, если там логика написана на if'ах, а не на std::enable_if'ах.
Глаза у меня добрые, но рубашка — смирительная!
Re[10]: Templates
От: alpha21264 СССР  
Дата: 05.07.18 08:47
Оценка: +1
Здравствуйте, so5team, Вы писали:

S>Этот пример достаточно компактен и понятен. Как раз то, что нужно для ленивого обсуждения на форуме. И то, даже аналог этого простого случая никто вменяемо не без шаблонов переписать не смог (ну нельзя же вот это
Автор: alpha21264
Дата: 04.07.18
воспринимать всерьез).


Эттто почему? Рвёт твои шаблоны (не темплейты)? Хотя темплейты тоже наверное рвёт.

Течёт вода Кубань-реки куда велят большевики.
Re[11]: Templates
От: so5team https://stiffstream.com
Дата: 05.07.18 08:55
Оценка:
Здравствуйте, alpha21264, Вы писали:

A>Эттто почему?


Потому что это троллинг. Причем троллинг так себе. Как и шутки, впрочем.
Re[4]: Box2D
От: so5team https://stiffstream.com
Дата: 05.07.18 08:59
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>Есть такой мужик, Erin Catto. Он создал самый популярный в мире движок 2D-физики...


Как-то вы издалека зашли. Нужно было бы сразу с Линуса Торвальдса, который еще в начале 90-х выбрал чистый C вместо C++ для своего ядра. Судя по успеху результата, выбор был более чем оправданным.
Re[12]: Templates
От: alpha21264 СССР  
Дата: 05.07.18 09:20
Оценка: +1
Здравствуйте, so5team, Вы писали:

A>>Эттто почему?


S>Потому что это троллинг. Причем троллинг так себе. Как и шутки, впрочем.


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

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

Течёт вода Кубань-реки куда велят большевики.
Re[13]: Templates
От: night beast СССР  
Дата: 05.07.18 09:27
Оценка:
Здравствуйте, alpha21264, Вы писали:

A>Эк тебя корёжит!

A>Это не тролинг.
A>Давай рассказывай, почему в данном случае нельзя обойтись одним битом вместо всех наворотов.


и где ты там один бит углядел?
ну а по сути, твое предложение сводится к реализации std::variant собственными силами.
Re[14]: Templates
От: alpha21264 СССР  
Дата: 05.07.18 09:38
Оценка: :)
Здравствуйте, night beast, Вы писали:

A>>Давай рассказывай, почему в данном случае нельзя обойтись одним битом вместо всех наворотов.


NB>

NB>и где ты там один бит углядел?

bool successful ; // Да, я знаю, что компилятор тут использует целый int, но это не мои проблемы.

NB>ну а по сути, твое предложение сводится к реализации std::variant собственными силами.


Дааааааааа? Вот уж не знал! И нахрена мне std::variant, да ещё "собственными силами"?
Где? Зачем? Что такое std::variant? Как жили без std::variant? Почему до сих пор без него живут?

Течёт вода Кубань-реки куда велят большевики.
Re[13]: Templates
От: so5team https://stiffstream.com
Дата: 05.07.18 09:39
Оценка:
Здравствуйте, alpha21264, Вы писали:

A>Эк тебя корёжит!


Желание общаться конструктивно теперь называется "корёжит"? Ok.

A>Давай рассказывай, почему в данном случае нельзя обойтись одним битом вместо всех наворотов.


Для начала укажем на то, что вы проигнорировали тот важный факт, что successful_result_t и failed_result_t -- это не пустые структуры. В них есть свои собственные поля, значения которых важны. Причем, чтобы разговор был интереснее, давайте сделаем так, чтобы эти поля не пересекались. Т.е., пусть будет:
struct successful_result_t {
  A a_;
  B b_;
  C c_;
  ... // Конструктор/деструктор и пр. лабуда.
};

struct failed_result_t {
  D d_;
  E e_;
  ... // Конструктор/деструктор и пр. лабуда.
};


Покажите, пожалуйста, как вы собираетесь в своем подходе передавать в reply_t либо содержимое successful_result_t, либо содержимое failed_result_t.

По поводу bool successful_ -- садитесь, двойка. Еще одна подобная шутка и будете признаны профнепригодным, а значит, и не диалогоспособным.
Хотя бы уж enum class result_t { success, failure }. Его и расширять можно, и контроль со стороны компилятора гораздо лучше.
Re[15]: Templates
От: niXman Ниоткуда https://github.com/niXman
Дата: 05.07.18 09:39
Оценка:
Здравствуйте, alpha21264, Вы писали:

A>bool successful ; // Да, я знаю, что компилятор тут использует целый int, но это не мои проблемы.


пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[3]: Templates
От: smeeld  
Дата: 05.07.18 09:40
Оценка:
Здравствуйте, Erop, Вы писали:

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


S>>Вы вместе с вашими матерыми C++ разработчиками вместо этого предлагаете что?


E>Это, кстати, хорошее упражнение. Представить, что шаблонов нет, или что свои нельзя писать и подумать, как написать тоже самое без шаблонов.


Да сколько угодно, писать на Cи, а это будет именно Си, с классами, RAII и прочей шелухой, что в Си различными фреймворками реализуется в крупных проектах, вроде ядер, вообще просто. Проще чем на С++, что означает развитие системы абстракций в виде множества параметризованных обобщённых типов и взваимосвязей между ними. Короче, С++-это когда структурирование и обобщение в помощью шаблонов, если этого нет, то это Си с классами.
Re[15]: Templates
От: so5team https://stiffstream.com
Дата: 05.07.18 09:42
Оценка:
Здравствуйте, alpha21264, Вы писали:

A>Где? Зачем? Что такое std::variant?


type-safe union XXI-го века. Пора вылазить из криокамеры.

A>Как жили без std::variant?


Не жили. Использовали либо union, либо делали свои лисапеды с преаллоцированными буферами, placement new и ручным вызовом деструкторов.

A>Почему до сих пор без него живут?


Разве это жизнь?
Re[16]: Templates
От: alpha21264 СССР  
Дата: 05.07.18 09:42
Оценка:
Здравствуйте, niXman, Вы писали:

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


A>>bool successful ; // Да, я знаю, что компилятор тут использует целый int, но это не мои проблемы.


X>


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

Течёт вода Кубань-реки куда велят большевики.
Re[17]: Templates
От: niXman Ниоткуда https://github.com/niXman
Дата: 05.07.18 09:45
Оценка: -1
Здравствуйте, alpha21264, Вы писали:

A>Сам дурак.

тебя в хлеву воспитывали?

A>Ты не фейспалмы раскидывай, а давай рассказывай, почему тут нельзя обойтись одной единственной переменной.

я лишь указал на то, что bool это не int, а байт. по-крайней мере я не слышал о платформе с восьмибитными интами...
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[14]: Templates
От: alpha21264 СССР  
Дата: 05.07.18 09:59
Оценка: +1 -1 :)
Здравствуйте, so5team, Вы писали:

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


A>>Эк тебя корёжит!


S>Желание общаться конструктивно теперь называется "корёжит"? Ok.


Там не было желания общаться конструктивно.

A>>Давай рассказывай, почему в данном случае нельзя обойтись одним битом вместо всех наворотов.


S>Для начала укажем на то, что вы проигнорировали тот важный факт, что successful_result_t и failed_result_t -- это не пустые структуры. В них есть свои собственные поля, значения которых важны. Причем, чтобы разговор был интереснее, давайте сделаем так, чтобы эти поля не пересекались. Т.е., пусть будет:

S>
struct successful_result_t {
S>  A a_;
S>  B b_;
S>  C c_;
S>  ... // Конструктор/деструктор и пр. лабуда.
S>};

S>struct failed_result_t {
S>  D d_;
S>  E e_;
S>  ... // Конструктор/деструктор и пр. лабуда.
S>};
S>


Я сделаю вот так:
struct result_t {
   bool successful ;
   A a_;
   B b_;
   C c_;
   D d_;
   E e_;
// Конструктор/деструктор и пр. лабуда.
};


По жизни в 90% случаев result_t будет содержать ТОЛЬКО данные успешного завершения.
Данных неуспешного завершения не будет вообще (поэтому многие вместо ошибки вообще возвращают NULL).
В остальных 10% случаев данные неуспешного завершения разместятся в тех же полях, что и успешного.
А если совсем-совсем жалко места (ну это совсем скупердяем надо быть) мы умеем использовать слово union.

S>Покажите, пожалуйста, как вы собираетесь в своем подходе передавать в reply_t либо содержимое successful_result_t, либо содержимое failed_result_t.


Передавать я буду как обычно:
функция( Результат );
или
return Результат ;

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

S>По поводу bool successful_ -- садитесь, двойка. Еще одна подобная шутка и будете признаны профнепригодным, а значит, и не диалогоспособным.


Сам дурак.

S>Хотя бы уж enum class result_t { success, failure }. Его и расширять можно, и контроль со стороны компилятора гораздо лучше.


Зачем Вы опять делаете навороты на ровном месте?!
Когда НАДО будет я расширю bool на enum.
Но заранее-то это зачем делать?
bool студенты проходят в школе, это заранее известная конструкция,
а за enum class result_t надо лезть в то место, где она описана.

Течёт вода Кубань-реки куда велят большевики.
Re[4]: Box2D
От: smeeld  
Дата: 05.07.18 09:59
Оценка:
Здравствуйте, Qbit86, Вы писали:


Q>На С++. Чтобы создать качественную симуляцию, надо разбираться в том, как организовать детект коллизий, солвер контактов и констрейнтов, вычислительно устойчивую интеграцию, etc. Можно ли его назвать неквалифицированным программистом? А между тем там не то что шаблонов, там даже RAII толком нет, голый Си с классами и прости господи сырыми указателями, плюс-минус использование std::vector'а какого-нибудь. Зато движок легко читать и понимать, и можно не приходя в сознание портировать на любой JavaScript.


Тут в треде не говорится о том, должен ли чего-то знать разраб кроме ЯП-а, или нет, конечно должен. Кучу всего. Вернее, уметь быстро изучать ту или иную предметную область, попав на проект, необходимую для текущего проекта, так как всё знать невозможно, а проекты могут быть самые разные, от REST сервисов до нейронки. И ЯП-ов он должен знать не один а с десяток. Тут речь о том, как именно писать на C++, чтоб это можно было назвать кодом на C++, а не на Си с классами, и это безотносительно каких-либо иных знаний и компетенций.
Re[5]: Box2D
От: lpd Черногория  
Дата: 05.07.18 10:04
Оценка: +2
Здравствуйте, smeeld, Вы писали:

S>Тут речь о том, как именно писать на C++, чтоб это можно было назвать кодом на C++, а не на Си с классами, и это безотносительно каких-либо иных знаний и компетенций.


Называй как хочешь. C++ и есть С с классами, а не нечто сверхестественное — за это многие его и ценят. Вместо шаблонов почти всегда достаточно использовать полиморфизм, как уже упоминал Qbit86.
У сложных вещей обычно есть и хорошие, и плохие аспекты.
Берегите Родину, мать вашу. (ДДТ)
Re[15]: Templates
От: so5team https://stiffstream.com
Дата: 05.07.18 10:07
Оценка:
Здравствуйте, alpha21264, Вы писали:

S>>Желание общаться конструктивно теперь называется "корёжит"? Ok.


A>Там не было желания общаться конструктивно.


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

A>>>Давай рассказывай, почему в данном случае нельзя обойтись одним битом вместо всех наворотов.


A>Я сделаю вот так:

A>
A>struct result_t {
A>   bool successful ;
A>   A a_;
A>   B b_;
A>   C c_;
A>   D d_;
A>   E e_;
A>// Конструктор/деструктор и пр. лабуда.
A>};
A>


Ожидаемо. Сейчас даже не будем говорить за оверхед по памяти/времени, т.к. в данном конкретном случае это не существенно.
Как вы собираетесь обеспечить гарантии того, что в случае неудачного результата программист не будет обращаться к полям a_, b_ и c_.

Ну а тема дальнейшего расширения набора результатов в вашем подходе вообще открывает какие-то бездны фейспалма.

A>А если совсем-совсем жалко места (ну это совсем скупердяем надо быть) мы умеем использовать слово union.


Судя по тому, что вы уже написали, вы вряд ли можете что-то использовать что-то сложнее bool-а и int-а.

A>Поэтому мне не нужно решать тех проблем, которые есть в случае с темплейтами.


И какие же это проблемы?

A>Зачем Вы опять делаете навороты на ровном месте?!


Это не навороты. Это опыт. Не только наш.
Re[6]: Box2D
От: so5team https://stiffstream.com
Дата: 05.07.18 10:09
Оценка: +1
Здравствуйте, lpd, Вы писали:

lpd>Вместо шаблонов почти всегда достаточно использовать полиморфизм, как уже упоминал Qbit86.


Интересно было бы посмотреть на type-safe union без шаблонов на полиморфизме.
Re[16]: Templates
От: alpha21264 СССР  
Дата: 05.07.18 10:10
Оценка:
Здравствуйте, so5team, Вы писали:

A>>Где? Зачем? Что такое std::variant?


S>type-safe union XXI-го века. Пора вылазить из криокамеры.


Зачем тебе в данном случае type-safe? Мне и в камере хорошо.

A>>Как жили без std::variant?


S>Не жили. Использовали либо union, либо делали свои лисапеды с преаллоцированными буферами, placement new и ручным вызовом деструкторов.


В данном случае union-а хватит до конца жизни вселенной.

A>>Почему до сих пор без него живут?


S>Разве это жизнь?


Хорошая жизнь. Я попробовал, мне понравилось.

Течёт вода Кубань-реки куда велят большевики.
Re[17]: Templates
От: so5team https://stiffstream.com
Дата: 05.07.18 10:13
Оценка:
Здравствуйте, alpha21264, Вы писали:

A>Зачем тебе в данном случае type-safe?


Чтобы коэфициент спокойного сна был побольше.

A>Мне и в камере хорошо.


Тогда понятно.

A>В данном случае union-а хватит до конца жизни вселенной.


Вы это откуда взяли?

A>Я попробовал, мне понравилось.


Еще раз понятно. Только вот XXI-ый век на дворе. Многие распробовали блага современной цивилизации. В каменный век не хотят.
Re[7]: Box2D
От: lpd Черногория  
Дата: 05.07.18 10:17
Оценка: +2
Здравствуйте, so5team, Вы писали:

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


lpd>>Вместо шаблонов почти всегда достаточно использовать полиморфизм, как уже упоминал Qbit86.


S>Интересно было бы посмотреть на type-safe union без шаблонов на полиморфизме.


В 98% случаев абсолютно все равно, сколько структура занимает памяти — сейчас не 1Mb памяти на все, и многие вообще пишут на Java.
В твоем примере можно просто reply_success_t и reply_failure_t унаследовать от reply_t, и этого достаточно для реализации любой логики. Либо result_success_t и result_failure_t унаследовать от result_t. В крайнем случае использовать union для полей, но только если это действительно необходимо.
У сложных вещей обычно есть и хорошие, и плохие аспекты.
Берегите Родину, мать вашу. (ДДТ)
Re[8]: Box2D
От: so5team https://stiffstream.com
Дата: 05.07.18 10:23
Оценка:
Здравствуйте, lpd, Вы писали:

S>>Интересно было бы посмотреть на type-safe union без шаблонов на полиморфизме.


lpd>В 98% случаев абсолютно все равно, сколько структура занимает памяти — сейчас не 1Mb памяти на все, и многие вообще пишут на Java.


В том-то и дело, что там, где не важно потребление ресурсов, спокойно пишут на Java/Scala/Kotlin/Ceylon, C#/F#/VisualBasic, Python, Ruby и даже, как говорят, на Haskell-е. Место для C++ осталось там, где важно иметь контроль за происходящим.

lpd>В твоем примере можно просто reply_success_t и reply_failure_t унаследовать от reply_t, и этого достаточно для реализации любой логики.


Во-первых, *_resul_t специально отделены от reply_t. Т.к. там, где получается *_result_t, никто ничего не знает о reply_t.
Во-вторых, логика будет усложнена за счет того, что придется ловить не один reply, а два разных (а потом, возможно и больше).

lpd>Либо result_success_t и result_failure_t унаследовать от result_t.


И передавать их как? Через unique_ptr?

lpd>В крайнем случае использовать union для полей, но только если это действительно необходимо.


C union-ом все становится интереснее как только туда помещаются данные с нетривиальными деструкторами. И тогда сразу же возникает вопрос: чем это лучше std::variant?
Re[9]: Box2D
От: lpd Черногория  
Дата: 05.07.18 10:34
Оценка: +1 :))
Здравствуйте, so5team, Вы писали:

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


S>В том-то и дело, что там, где не важно потребление ресурсов, спокойно пишут на Java/Scala/Kotlin/Ceylon, C#/F#/VisualBasic, Python, Ruby и даже, как говорят, на Haskell-е. Место для C++ осталось там, где важно иметь контроль за происходящим.


Я сторонник того, чтобы оптимизировать алгоритм, а код оставлять максимально простым и понятным. Для оптимизации все равно union и ассемблер сильнее, чем шаблоны и компилятор.

lpd>>В твоем примере можно просто reply_success_t и reply_failure_t унаследовать от reply_t, и этого достаточно для реализации любой логики.


S>Во-первых, *_resul_t специально отделены от reply_t. Т.к. там, где получается *_result_t, никто ничего не знает о reply_t.

Я имел ввиду либо базовый result_t, либо базовый reply_t — не обязательно оба вместе.
S>Во-вторых, логика будет усложнена за счет того, что придется ловить не один reply, а два разных (а потом, возможно и больше).
Отличие только в том, что с использованием полиморфизма для result_successful_t и result_failure_t нужно будет добавить один базовый класс: result_t. Мне такой путь нравится больше шаблонов, хотя похоже, что это вопрос предпочтений.
Для удобства можно добавить в result_t поле enum с кодом возврата.

lpd>>Либо result_success_t и result_failure_t унаследовать от result_t.


S>И передавать их как? Через unique_ptr?

Умные указатели я считаю только усложняющими управление памятью, хотя это оффтоп. Передавать просто через указатель "result_t *" — это самое простое.

S>C union-ом все становится интереснее как только туда помещаются данные с нетривиальными деструкторами. И тогда сразу же возникает вопрос: чем это лучше std::variant?

reply_t и result_t обычно простые классы. У тебя есть указатель на result_t. В result_failure_t определен деструктор. Не вижу сложностей.
У сложных вещей обычно есть и хорошие, и плохие аспекты.
Берегите Родину, мать вашу. (ДДТ)
Отредактировано 05.07.2018 10:35 lpd . Предыдущая версия .
Re[10]: Box2D
От: so5team https://stiffstream.com
Дата: 05.07.18 10:56
Оценка: +2
Здравствуйте, lpd, Вы писали:

lpd>Я сторонник того, чтобы оптимизировать алгоритм, а код оставлять максимально простым и понятным.


Ну надо же. В какую сторону вы еще разговор уведете вместо того, чтобы показать type-safe union без шаблонов на полиморфизме?

lpd>Для оптимизации все равно union и ассемблер сильнее, чем шаблоны и компилятор.


Правда?

lpd>Я имел ввиду либо базовый result_t, либо базовый reply_t — не обязательно оба вместе.


Это понятно. Только вы, очевидно, не отдаете себе отчет о том, как будет меняться код в одном и другом случае. Приходится вам это объяснять.

lpd>Отличие только в том, что с использованием полиморфизма для result_successful_t и result_failure_t нужно будет добавить один базовый класс: result_t. Мне такой путь нравится больше шаблонов, хотя похоже, что это вопрос предпочтений.


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

S>>И передавать их как? Через unique_ptr?

lpd>Умные указатели я считаю только усложняющими управление памятью, хотя это оффтоп. Передавать просто через указатель "result_t *" — это самое простое.

Т.е. мы создаем result в динамической памяти? Дергаем хип и создаем лишнюю косвенность там, где можно было обойтись передачей/перемещением значения.

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

lpd>reply_t и result_t обычно простые классы.


Кто вам это сказал?
Re[11]: Box2D
От: lpd Черногория  
Дата: 05.07.18 11:12
Оценка: -1 :)
Здравствуйте, so5team, Вы писали:

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


lpd>>Отличие только в том, что с использованием полиморфизма для result_successful_t и result_failure_t нужно будет добавить один базовый класс: result_t. Мне такой путь нравится больше шаблонов, хотя похоже, что это вопрос предпочтений.


S>Ну так напишите хотя бы приблизительный код. Сразу станет видно и его объем, и его надежность, и его понятность.


Писать код чтобы продемонстрировать полиморфизм, и его отличия от шаблонов? Открой любую книжку по C++ начала 200х. Сферический обработчик reply_t интереса не представляет, т.к. все зависит от деталей использование этих объектов.

S>>>И передавать их как? Через unique_ptr?

lpd>>Умные указатели я считаю только усложняющими управление памятью, хотя это оффтоп. Передавать просто через указатель "result_t *" — это самое простое.

S>Т.е. мы создаем result в динамической памяти? Дергаем хип и создаем лишнюю косвенность там, где можно было обойтись передачей/перемещением значения.


Ну все, фанатика move-семантики я переубедить не берусь. Все-таки подумай о том, что из использования C++ в требовательных к ресурсам проектах не значит, что любая операция в программе на C++ должна быть обязательно соптимизирована move-семантикой. А для тех очень редких операции, которые все-таки нужно оптимизировать, можно сделать пул объектов.

S>А потом, что вообще прекрасно, отдаем кому-то владеющий голый указатель в надежде на то, что кто-то когда-то его удалит?

S>Етить-колотить, казалось, что в мире C++ подобные взгляды на управление памятью уже в дикой природе не встречаются, только в каких-то особых замкнутых заповедниках. А поди ж ты.

В каждом конкретном случае такую проблему можно решить без умных указателей — вариантов решений много, включая подсчет ссылок. Хотя от полноценного GC польза была бы.
У сложных вещей обычно есть и хорошие, и плохие аспекты.
Берегите Родину, мать вашу. (ДДТ)
Re[12]: Box2D
От: so5team https://stiffstream.com
Дата: 05.07.18 11:20
Оценка: +1
Здравствуйте, lpd, Вы писали:

Про type-safe union разговор закрыли за невозможностью получить оный без шаблонов, правильно?

lpd>Писать код чтобы продемонстрировать полиморфизм, и его отличия от шаблонов?


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

S>>Т.е. мы создаем result в динамической памяти? Дергаем хип и создаем лишнюю косвенность там, где можно было обойтись передачей/перемещением значения.


lpd>Ну все, фанатика move-семантики я переубедить не берусь.


Когда сказать нечего начинают ярлыки развешивать.

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


Во-первых, подсчет ссылок -- это уже умные указатели и есть.
Во-вторых, изначально речь шла про unique_ptr, который, в обычных случаях (т.е. со штатным deleter-ом), стоит столько же, сколько обычный голый указатель, и не требует ручного контроля за временем жизни. Но у вас же какие-то религиозные предубеждения против шаблонов и умных указателей. Потому остается закатывать Солнце вручную.

Простите, но с такими взглядами можно было программировать где-то до 1994-1995-х годов. С тех пор уже больше 20 лет прошло. Пора уже научиться пользоваться благами цивилизации.
Re[10]: Templates
От: chaotic-kotik  
Дата: 05.07.18 12:02
Оценка:
Здравствуйте, night beast, Вы писали:

NB>и чем замена ссылки на вариант лучше исходного кода? (кроме добавления лишнего мува)


Тем что можно вынести реализацию в cpp, лишнего мува там вроде нет, когда ты вызываешь к-тор reply_t, тебе нужно использовать move, без него будет копирование.
Вариант с variant в к-торе будет выглядеть так же, в точке использования, так как к-тор std::variant не помечен как explicit. Т.е. и там и там будет reply_t foo(std::move(value));
Re[11]: Templates
От: night beast СССР  
Дата: 05.07.18 12:09
Оценка:
Здравствуйте, chaotic-kotik, Вы писали:

NB>>и чем замена ссылки на вариант лучше исходного кода? (кроме добавления лишнего мува)


CK>Тем что можно вынести реализацию в cpp, лишнего мува там вроде нет, когда ты вызываешь к-тор reply_t, тебе нужно использовать move, без него будет копирование.


с чего бы вдруг? там передача по ссылке.

CK>Вариант с variant в к-торе будет выглядеть так же, в точке использования, так как к-тор std::variant не помечен как explicit. Т.е. и там и там будет reply_t foo(std::move(value));


и потом этот variant будет муваться в член класса. итого 2 мува.
Re[10]: Templates
От: chaotic-kotik  
Дата: 05.07.18 12:11
Оценка: +1
Здравствуйте, so5team, Вы писали:

S>Здравствуйте, chaotic-kotik, Вы писали:


CK>>мой вариант он проигнорировал, так что, делаем выводы


S>А разве был какой-то вариант? Передача std::variant прямо в конструктор reply -- это так себе выбор. Поскольку хранение result-а именно в виде variant -- это, по сути, деталь реализации reply_t. Не есть хорошо, что эта деталь уже торчит наружу. Но прибивать к ней гвоздями еще и конструктор reply... Кому как, короче говоря.


У тебя весь код живет в hpp, т.е. наружу торчит вообще все. Т.е. представить что код, использующий reply_t не знает про std::variant — невозможно.
std::variant — штука из стандартной библиотеки, не вижу особой проблемы в том, чтобы передавать его. Ты же не пытаешься спрятать std::string как деталь реализации?

S>Этот пример достаточно компактен и понятен. Как раз то, что нужно для ленивого обсуждения на форуме. И то, даже аналог этого простого случая никто вменяемо не без шаблонов переписать не смог (ну нельзя же вот это
Автор: alpha21264
Дата: 04.07.18
воспринимать всерьез).


Даже у этого примера есть преимущество перед твоим. Он будет работать везде. Твой вызовет проблемы даже на некоторых х86 дистрибутивах linux (c gcc 4.x), не говоря уже про всякие контроллеры.
Re[12]: Templates
От: chaotic-kotik  
Дата: 05.07.18 12:17
Оценка:
Здравствуйте, night beast, Вы писали:

CK>>Тем что можно вынести реализацию в cpp, лишнего мува там вроде нет, когда ты вызываешь к-тор reply_t, тебе нужно использовать move, без него будет копирование.


NB>с чего бы вдруг? там передача по ссылке.


у std::variant есть к-тор с perfect forwarding — https://en.cppreference.com/w/cpp/utility/variant/variant (номер 4)

NB>и потом этот variant будет муваться в член класса. итого 2 мува.


о ужас!
Re[11]: Templates
От: so5team https://stiffstream.com
Дата: 05.07.18 12:25
Оценка:
Здравствуйте, chaotic-kotik, Вы писали:

S>>А разве был какой-то вариант? Передача std::variant прямо в конструктор reply -- это так себе выбор. Поскольку хранение result-а именно в виде variant -- это, по сути, деталь реализации reply_t. Не есть хорошо, что эта деталь уже торчит наружу. Но прибивать к ней гвоздями еще и конструктор reply... Кому как, короче говоря.


CK>У тебя весь код живет в hpp, т.е. наружу торчит вообще все. Т.е. представить что код, использующий reply_t не знает про std::variant — невозможно.


Не нужно выдавать свои проблемы с фантазией за объективные факторы:
class reply_t final {
  ...
  std::variant<successful_result_t, failed_result_t> result_;
public:
  ...
  bool successful() const noexcept { return std::holds_alternative<successful_result_t>(result_); }

  template<typename L>
  decltype(auto) on_success(L handler) const {
    return handler(std::get<successful_result_t>(result_));
  }

  bool failed() const noexcept { return std::holds_alternative<failed_result_t>(result_); }
  ...
};
...
auto reply = receive_reply();
if(reply.successful())
  return reply.on_success([](const auto & d) {...});
else ...

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

CK>Даже у этого примера есть преимущество перед твоим. Он будет работать везде.


Будет ли он работать -- это еще вопрос прямизны рук разработчика.

CK>Твой вызовет проблемы даже на некоторых х86 дистрибутивах linux (c gcc 4.x), не говоря уже про всякие контроллеры.


Ну что поделать, придется кросскомпиляцией заниматься.
Re[13]: Templates
От: night beast СССР  
Дата: 05.07.18 12:36
Оценка:
Здравствуйте, chaotic-kotik, Вы писали:

NB>>с чего бы вдруг? там передача по ссылке.


CK>у std::variant есть к-тор с perfect forwarding — https://en.cppreference.com/w/cpp/utility/variant/variant (номер 4)


и?

NB>>и потом этот variant будет муваться в член класса. итого 2 мува.


CK>о ужас!


я тебе просто показал, откуда дополнительный мув взялся
Re[12]: Templates
От: chaotic-kotik  
Дата: 05.07.18 12:42
Оценка: +1
Здравствуйте, so5team, Вы писали:


S>Не нужно выдавать свои проблемы с фантазией за объективные факторы:

S>
class reply_t final {
S>  ...
S>  std::variant<successful_result_t, failed_result_t> result_;
S>public:
S>  ...
S>  bool successful() const noexcept { return std::holds_alternative<successful_result_t>(result_); }

S>  template<typename L>
S>  decltype(auto) on_success(L handler) const {
S>    return handler(std::get<successful_result_t>(result_));
S>  }

S>  bool failed() const noexcept { return std::holds_alternative<failed_result_t>(result_); }
S>  ...
S>};
S>...
S>auto reply = receive_reply();
S>if(reply.successful())
S>  return reply.on_success([](const auto & d) {...});
S>else ...

S>То, что все это в hpp-файле не играет никакой роли, когда речь заходит о публичных и приватных полях/методах класса.

ты хочешь сделать вид, что в месте вызова on_success <variant> не подключен?

S>Ну что поделать, придется кросскомпиляцией заниматься.


занимался ли ты на практике чем-то подобным? так чтобы с зависимостями и сборкой пакетов под разные дистрибутивы?
Re[14]: Templates
От: chaotic-kotik  
Дата: 05.07.18 12:44
Оценка:
Здравствуйте, night beast, Вы писали:


NB>я тебе просто показал, откуда дополнительный мув взялся


я не распарсил, думал что ты имеешь ввиду что в первом случае std::move для параметра использовать не нужно
и что передается по ссылке?
Re[15]: Templates
От: night beast СССР  
Дата: 05.07.18 12:47
Оценка:
Здравствуйте, chaotic-kotik, Вы писали:

NB>>я тебе просто показал, откуда дополнительный мув взялся


CK>я не распарсил, думал что ты имеешь ввиду что в первом случае std::move для параметра использовать не нужно

CK>и что передается по ссылке?

в исходном коде мув один. в твоем -- два (один неявный)
Re[13]: Templates
От: so5team https://stiffstream.com
Дата: 05.07.18 12:49
Оценка:
Здравствуйте, chaotic-kotik, Вы писали:

CK>ты хочешь сделать вид, что в месте вызова on_success <variant> не подключен?


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

Или для вас принципиально то, чтобы в заголовочном файле с определением reply_t вообще из стандартных заголовочных файлов ничего не было подключено (т.е., чтобы pimpl во все поля)? Тогда ваша же идея на счет использования std::variant прямо в конструкторе оказывается несостоятельна. Вы уж определитесь.

S>>Ну что поделать, придется кросскомпиляцией заниматься.


CK>занимался ли ты на практике чем-то подобным? так чтобы с зависимостями и сборкой пакетов под разные дистрибутивы?


Что вы тянете, сразу длину в сантиметрах пишите. Ну или в миллиметрах, чтобы еще солиднее было.
Re[16]: Templates
От: alpha21264 СССР  
Дата: 05.07.18 13:04
Оценка: +1
Здравствуйте, so5team, Вы писали:


A>>Там не было желания общаться конструктивно.


S>По вашим сообщениям с фразами "Сам дурак" и "Ну это я прикололся" было заметно, что у вас нет желания общаться конструктивно.


"Сам дурак" произносится, когда сначала было слово "Дурак".
Да, фейспалм — это тоже "Дурак".

A>>>>Давай рассказывай, почему в данном случае нельзя обойтись одним битом вместо всех наворотов.


A>>Я сделаю вот так:

A>>
A>>struct result_t {
A>>   bool successful ;
A>>   A a_;
A>>   B b_;
A>>   C c_;
A>>   D d_;
A>>   E e_;
A>>// Конструктор/деструктор и пр. лабуда.
A>>};
A>>


S>Ожидаемо. Сейчас даже не будем говорить за оверхед по памяти/времени, т.к. в данном конкретном случае это не существенно.

S>Как вы собираетесь обеспечить гарантии того, что в случае неудачного результата программист не будет обращаться к полям a_, b_ и c_.

Ремнём по жопе. Этот способ всегда работает.
Есть другой способ — присваивать данным осмысленные значения даже в случае неуспеха
(например пустые массивы, нулевые строки и т.п.).
И пусть обращается. Программа продолжит работать. И даже правильно.
И даже не нужна специальная обработка ошибок.

Кстати, по поводу оверхеда. По моему опыту у темплейтов оверхеда больше.
Потому что копи-пастинг со всеми вытекающими.

S>Ну а тема дальнейшего расширения набора результатов в вашем подходе вообще открывает какие-то бездны фейспалма.


Сам дурак (это Вам за фейспалм).
В данном случае результат может быть либо успешный, либо неуспешный.
Какое тут расширение? Зачем?
Вы вообще, попробуйте сформулировать, что такое "результат",
и зачем Вы на каждый новый результат новый тип плодите.

A>>А если совсем-совсем жалко места (ну это совсем скупердяем надо быть) мы умеем использовать слово union.


S>Судя по тому, что вы уже написали, вы вряд ли можете что-то использовать что-то сложнее bool-а и int-а.


Опять хамите, а потом удивляетесь, что сам дурак. — Сам дурак.

A>>Поэтому мне не нужно решать тех проблем, которые есть в случае с темплейтами.


S>И какие же это проблемы?


Ну очевидно же — расплодили типов на ровном месте.

A>>Зачем Вы опять делаете навороты на ровном месте?!


S>Это не навороты. Это опыт. Не только наш.


Это ненужные навороты. Так говорит опыт. И не только наш.

Течёт вода Кубань-реки куда велят большевики.
Re[17]: Templates
От: so5team https://stiffstream.com
Дата: 05.07.18 13:23
Оценка:
Здравствуйте, alpha21264, Вы писали:

A>Да, фейспалм — это тоже "Дурак".


Вы сначала разберитесь кто вам фейспалмы показывает, а потом "Дураками" раскидывайтесь. А то ведь складывается впечатление, что вы с кем-то другим пытаетесь говорить.

A>Ремнём по жопе. Этот способ всегда работает.


Очевидно недостаточно, раз столько багов в софте. Или в вашем софте багов нет?

A>Есть другой способ — присваивать данным осмысленные значения даже в случае неуспеха

A>(например пустые массивы, нулевые строки и т.п.).

Вы представляете, а при использовании sum types (это которые и есть std::variant) этого делать не нужно. Прогресс таки не стоит на месте.

A>И пусть обращается. Программа продолжит работать. И даже правильно.


Это сейчас больше на молитвы похоже.

A>Кстати, по поводу оверхеда. По моему опыту у темплейтов оверхеда больше.

A>Потому что копи-пастинг со всеми вытекающими.

Это у вас представления о шаблонах из начала 90-х. Но в вашу криокамеру, наверное, ничего нового не попадает.

A>В данном случае результат может быть либо успешный, либо неуспешный.


Это вам так кажется.

A>Ну очевидно же — расплодили типов на ровном месте.


По сравнению с перечислением вообще всех полей в одном месте -- это не то, что не проблема, это даже не мелкие неприятности.

A>Это ненужные навороты. Так говорит опыт. И не только наш.


Судя по коду из начала 90-х у вас и опыт оттуда же. Между тем в мире нового опыта накоплено масса. На основании которого делают folly::Expected, boost::outcome и предложения по добавлению дешевых исключений в C++. Казалось бы с чего бы это?
Re[14]: Templates
От: chaotic-kotik  
Дата: 05.07.18 13:53
Оценка:
Здравствуйте, so5team, Вы писали:


S>Может пора дурочку выключить? Если вам действительно что-то непонятно про разницу в использовании некоторого типа A в реализации некоторого типа B, и в интерфейсе этого типа B, то спросите что именно непонятно.


У меня в проекте тысячи единиц трансляции, допустим этот класс reply_t должен использоваться в десяти, от которых зависит еще 100, я подключаю reply.h с этим классом, а там — #include <variant>, соответственно, все это добро подключается в 100 разных единиц трасляции. При этом совершенно фиолетово где используется variant, в реализации, или в реализации и интерфейсе.

S>Или для вас принципиально то, чтобы в заголовочном файле с определением reply_t вообще из стандартных заголовочных файлов ничего не было подключено (т.е., чтобы pimpl во все поля)? Тогда ваша же идея на счет использования std::variant прямо в конструкторе оказывается несостоятельна. Вы уж определитесь.


Мне принципиально называть вещи своими именами. Не важно, где используется шаблон. Зависимость это зависимость. По этому, с моей точки зрения, мой вариант лучше, т.к. он позволяет уменьшить reply.h, спрятав часть кода в cpp файл.

Если бы я писал этот класс для своего текущего проекта, ***_result_t были бы наследниками абстрактного класса и в реализации класса был бы уникальный указатель на base_result_t вместо variant. Это позволило бы, например, иметь реализации base_result_t отличные от failure_result_t и success_result_t, причем даже такие, о которых "знает" только какой-то один компонент. Можно было бы поменять реализацию без перекомпиляции сотни единиц трансляции, которые зависят от reply_t.

S>Что вы тянете, сразу длину в сантиметрах пишите. Ну или в миллиметрах, чтобы еще солиднее было.


С восхищением смотрю на людей, успешно что-то кросс-компилирующих, особенно в нетривиальных случаях. Я ни разу не смог настроить CI так, чтобы без докера и отдельных серверов с ARM и Solaris для сборки под ARM и Solaris.
Re[15]: Templates
От: so5team https://stiffstream.com
Дата: 05.07.18 14:03
Оценка: +1
Здравствуйте, chaotic-kotik, Вы писали:

CK>У меня в проекте тысячи единиц трансляции, допустим этот класс reply_t должен использоваться в десяти, от которых зависит еще 100, я подключаю reply.h с этим классом, а там — #include <variant>, соответственно, все это добро подключается в 100 разных единиц трасляции. При этом совершенно фиолетово где используется variant, в реализации, или в реализации и интерфейсе.


Если определение одного типа сказывается на таком количестве единиц трансляции, то у вас проблемы и без шаблонов.
Ну и ваш вариант с передачей std::variant в конструктор напрямую здесь ничего не исправит.

CK>Мне принципиально называть вещи своими именами. Не важно, где используется шаблон. Зависимость это зависимость. По этому, с моей точки зрения, мой вариант лучше, т.к. он позволяет уменьшить reply.h, спрятав часть кода в cpp файл.


Вы сейчас точно в трезвом уме? Предлагаемый вами вариант выглядел бы так:
struct reply_t {
  using result_t = std::variant<successful_result_t, failed_result_t>;
  ...
  result_t result_;

  reply_t(request_id_t id, worker_id_t id, result_t result);
};

И ничего бы вы с "зависимостью" от std::variant не сделали бы.

CK>Если бы я писал этот класс для своего текущего проекта, ***_result_t были бы наследниками абстрактного класса и в реализации класса был бы уникальный указатель на base_result_t вместо variant. Это позволило бы, например, иметь реализации base_result_t отличные от failure_result_t и success_result_t, причем даже такие, о которых "знает" только какой-то один компонент. Можно было бы поменять реализацию без перекомпиляции сотни единиц трансляции, которые зависят от reply_t.


Да, если бы были сотни единиц трансляции, вам было бы пофигу на возможных наследников base_result_t и полноту обработки этих наследников, тогда да, можно было бы и без шаблонов. По счастью, у нас другая ситуация.
Re[16]: Templates
От: chaotic-kotik  
Дата: 06.07.18 07:56
Оценка:
Здравствуйте, so5team, Вы писали:

S>Если определение одного типа сказывается на таком количестве единиц трансляции, то у вас проблемы и без шаблонов.

S>Ну и ваш вариант с передачей std::variant в конструктор напрямую здесь ничего не исправит.

Я не утверждал что он исправит. Поинт был в том, что зависимость есть зависимость и если используешь шаблоны, то приходится размещать код в hpp файлах, а значит увеличивать количество зависимостей и связность, даже если зависимости в реализации, а не в интерфейсе.
Для твоей библиотеки (ссылка выше была), это в общем-то и не проблема. Если бы мне нужно было использовать ее в своем big-ass проекте, я бы просто подключил ее в одном срр и показал наружу какой-нибудь удобный мне интерфейс. Но вот для вещей, которые активно используются внутри проекта практически везде, мы так не делаем. Вот открыл сейчас хедер в рабочем проекте, а там первые 200 строк вот такого:

namespace Foo {
namespace Bar { class A; class B; }
namespace Buzz { 
    class C;
    ...
}
}


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

S>Вы сейчас точно в трезвом уме? Предлагаемый вами вариант выглядел бы так:

S>
struct reply_t {
S>  using result_t = std::variant<successful_result_t, failed_result_t>;
S>  ...
S>  result_t result_;

S>  reply_t(request_id_t id, worker_id_t id, result_t result);
S>};

S>И ничего бы вы с "зависимостью" от std::variant не сделали бы.

Я этот код воспринял как toy example, честно говоря. Если это буквально вся реализация reply_t, то я ничего не менял бы.
Re[17]: Templates
От: so5team https://stiffstream.com
Дата: 06.07.18 08:06
Оценка:
Здравствуйте, chaotic-kotik, Вы писали:

CK>Для твоей библиотеки (ссылка выше была), это в общем-то и не проблема. Если бы мне нужно было использовать ее в своем big-ass проекте, я бы просто подключил ее в одном срр и показал наружу какой-нибудь удобный мне интерфейс. Но вот для вещей, которые активно используются внутри проекта практически везде, мы так не делаем. Вот открыл сейчас хедер в рабочем проекте, а там первые 200 строк вот такого:


Очень и очень хрупкий подход, особенно для кодовых баз, которые живут и активно эволюционируют больше 5 лет.

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

CK>Я этот код воспринял как toy example, честно говоря.


Не совсем. Это кусочек из маленького proof-of-concept проекта объемом в 1.5KLOC. На таких масштабах выводить иерархию result-ов -- это оверкилл. Даже если объем этого проекта увеличится в 100 раз, то и в этом случае проблем с шаблонами быть не должно.
Re[17]: Templates
От: night beast СССР  
Дата: 06.07.18 08:10
Оценка:
Здравствуйте, chaotic-kotik, Вы писали:

CK>Для твоей библиотеки (ссылка выше была), это в общем-то и не проблема. Если бы мне нужно было использовать ее в своем big-ass проекте, я бы просто подключил ее в одном срр и показал наружу какой-нибудь удобный мне интерфейс. Но вот для вещей, которые активно используются внутри проекта практически везде, мы так не делаем. Вот открыл сейчас хедер в рабочем проекте, а там первые 200 строк вот такого:


CK>namespace Foo {
CK>namespace Bar { class A; class B; }
CK>}


интрузивные умные указатели используются?
Re: Templates
От: vopl Россия  
Дата: 06.07.18 08:19
Оценка:
Здравствуйте, smeeld, Вы писали:

S>Заметил, что у большинства практикующих C++ достаточно негативное отношение к шаблонам в CPP. Речь идёт не о использовании std или boost, которые состоят из таковых процентов на 80, а о написании кода с активным применением параметризации функций и типов. Это многими считается чуть ли не признаком недостатка квалификации, типа матёрый плюсовик всегда найдёт способ расписать без создания параметризованных типов, и вообще найдёт способ писать на C++ как можно проще. Это вообще что такое? Если принять это мнение за справедливое, то получается, что std и boost писали джуны несмышлённые и не знающие как просто писать на CPP?


В соседней теме вести с полей о потенциальных нововведениях в c++20, и там довольно много всяких страшных слов для "шаблонных хейтеров" , выделю наиболее ужасные на мой взгляд:

Контракты и друзья
Концепты (без друзей)
Что нового можно писать в шаблонах и чем это полезно
constexpr virtual foo()
Reflection
Куда можно будет засунуть восклицательный знак и чем это может быть полезно
тотальное нашествие constexpr в стандартную библиотеку

Самым ужасающим будет (скорее всего в c++20 не войдет, позже) Reflection. По сравнению с ним — текущие "шаблоны" — просто детский лепет. Так что, "большинству практикующих C++" придется либо переключить негатив c "шаблонов" на более ужасные вещи, либо, если они уж и впрямь сильно практикуют — расширить, включив туда, кроме "шаблонов" — еще и эти новые страшилки
Re: Templates
От: rg45 СССР  
Дата: 06.07.18 08:26
Оценка: +3
Здравствуйте, smeeld, Вы писали:

S>Заметил, что у большинства практикующих C++ достаточно негативное отношение к шаблонам в CPP.


Ну, на счет большинства — это ты погорячился, имхо.

S>Речь идёт не о использовании std или boost, которые состоят из таковых процентов на 80, а о написании кода с активным применением параметризации функций и типов. Это многими считается чуть ли не признаком недостатка квалификации, типа матёрый плюсовик всегда найдёт способ расписать без создания параметризованных типов, и вообще найдёт способ писать на C++ как можно проще. Это вообще что такое? Если принять это мнение за справедливое, то получается, что std и boost писали джуны несмышлённые и не знающие как просто писать на CPP?


Святая церковь тоже поначалу выступала против электричества: было большое количество травм и несчастных случаев. И вообще, без него вполне можно было обходиться — и воды натаскать, и скотину покормить. А электричество нужно было только тем, кто хотел повыпендриваться.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 07.07.2018 12:01 rg45 . Предыдущая версия . Еще …
Отредактировано 07.07.2018 12:00 rg45 . Предыдущая версия .
Re[10]: Templates
От: Erop Россия  
Дата: 06.07.18 12:30
Оценка: +1
Здравствуйте, so5team, Вы писали:

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

Это всего лишь означает, что ты не умеешь контролировать их "расползание" по коду...

и

Это, кстати, хорошее упражнение...Попробуешь сам?

у вас оказалась на удивление тонкая душевная организация.


А ты с каким из двух утверждений не согласен?..
И при чём тут апломб? Это просто констатация фактов. Упражнение и правда хорошее.
IMHO, если человек вообще не может его выполнить он не особо квалифицированный программист...

Про код же, если говорить, то пока так и не понятно, зачем нужны result и reply?
В чём цель существования такого разделения?
Ещё интересно чем два разных result'a отличаются? И на каких аллокаторах аллокируются потроха? Или они все POD?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[8]: Templates
От: Erop Россия  
Дата: 06.07.18 12:39
Оценка:
Здравствуйте, night beast, Вы писали:

NB>если ты не готов предоставить код, который можно обсудить, то зачем было влезать?

Как справедливо заметил коллега, контекст всей этой истории знает только он.
Я задал ему пару вопросов, про контекст, на которые пока так и не получил ответа.

Например, почему бы не иметь базовый класс result, в котором иметь все нужные во всех случаях поля (то, что было в reply добавлено к варианту, и может что-то ещё), и выводить из него конкретные специфические результаты, ну и возвращать result* Или shared_ptr<result> или ещё какой владеющий указатель или, даже variant<result1, result2, result3,...>
Собственно этот вопрос про то, почему в качестве reply используется структура, а не вариант из результатов я тоже задавал, кстати
Мне конструкция с вариантом нравится меньше, так как повышается связность кода...

Вопрос в том, что бы обсуждать вопрос конструктивно. Возможно ответы на мои вопросы есть у тебя?..
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: Templates
От: Erop Россия  
Дата: 06.07.18 12:52
Оценка: +1
Здравствуйте, smeeld, Вы писали:

S>Да сколько угодно, писать на Cи, а это будет именно Си, с классами, RAII и прочей шелухой, что в Си различными фреймворками реализуется в крупных проектах, вроде ядер, вообще просто. Проще чем на С++, что означает развитие системы абстракций в виде множества параметризованных обобщённых типов и взваимосвязей между ними. Короче, С++-это когда структурирование и обобщение в помощью шаблонов, если этого нет, то это Си с классами.


Во-первых, это спор о словах. Какая разница что как называется?
Во-вторых, в С++ без шаблонов ещё останется динамический полиморфизм, так что это будет "Си с классами, наследованием и виртуальными функции"...

Ну и в-третьих, в том-то и смысл, что программы хорошо писать не как покрасивее, или там поабстрактнее, а как быстрее понимать поддерживать и развивать код. Часто неудачно выбранные абстракции только загромождают код. Это по опыту чисто.

В том-то и смысл обсуждаемого упражнения. Придумать три ХОРОШИХ решения. В парадигме "С++ с шаблонами", "Си с ООП" и "Си с классами". Сравнить плюсы и минусы полученных решений, и выработать хорошее итоговое.

p. s. Чисто в порядке обмена опытом. В окружающей вас культуре разработки, на этапе проектирования кода, в проектах принято рассматривать возможные альтернативы и аргументировать выбор лучшей? Или проекты пишутся в стиле "делаем так! я так вижу!"?
Оба стиля имеют плюсы и минусы, можно так же обсуждать комбинированные стратегии.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[9]: Templates
От: so5team https://stiffstream.com
Дата: 06.07.18 12:52
Оценка:
Здравствуйте, Erop, Вы писали:

E>Например, почему бы не иметь базовый класс result,


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

E>даже variant<result1, result2, result3,...>


Т.е. даже вы пришли к этому самому варианту.
Re[9]: Templates
От: night beast СССР  
Дата: 06.07.18 12:54
Оценка:
Здравствуйте, Erop, Вы писали:

NB>>если ты не готов предоставить код, который можно обсудить, то зачем было влезать?

E>Как справедливо заметил коллега, контекст всей этой истории знает только он.
E>Я задал ему пару вопросов, про контекст, на которые пока так и не получил ответа.

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

E>Например, почему бы не иметь базовый класс result, в котором иметь все нужные во всех случаях поля (то, что было в reply добавлено к варианту, и может что-то ещё), и выводить из него конкретные специфические результаты, ну и возвращать result* Или shared_ptr<result> или ещё какой владеющий указатель или, даже variant<result1, result2, result3,...>

E>Собственно этот вопрос про то, почему в качестве reply используется структура, а не вариант из результатов я тоже задавал, кстати

в reply как раз и хранится вариант из результатов. или тебе не нравится что там кроме результата еще что-то хранится?

E>Мне конструкция с вариантом нравится меньше, так как повышается связность кода...


ну уже вроде говорилось что вызывающий код ничего не знает про различные варианты, знает только про свои.
что до замены всего на динамический полиморфизм, то для такого решения должны быть какие-то причины а не просто желание избавиться от шаблонов.
Re[11]: Templates
От: so5team https://stiffstream.com
Дата: 06.07.18 12:57
Оценка:
Здравствуйте, Erop, Вы писали:

E>А ты с каким из двух утверждений не согласен?..


С обоими.

E>И при чём тут апломб? Это просто констатация фактов.


При том, что это апломб, а не констатация фактов.

E>IMHO, если человек вообще не может его выполнить он не особо квалифицированный программист...


Если вы думаете, что причина только в том, что "не может" и готовы давать оценки про "не особо квалифицированный", то разумно спросить: а вы-то сами кто? И, если совсем коротко, сколько в сантиметрах?

E>Про код же, если говорить, то пока так и не понятно, зачем нужны result и reply?


Тему перечитайте. Result -- это результат трансформации данных, не привязанный к тому, откуда эти данные пришли и кому их нужно отдать. А reply -- это result, который уже привязан к этой информации.

E>В чём цель существования такого разделения?


Так нужно было.

E>Ещё интересно чем два разных result'a отличаются?


В них разная информация, ваш К.О.

E>И на каких аллокаторах аллокируются потроха?


Штатных.

E>Или они все POD?


Не POD.
Re[10]: Templates
От: Erop Россия  
Дата: 06.07.18 13:10
Оценка: +1
Здравствуйте, so5team, Вы писали:

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


Так чтобы сравнивать, надо понимать как определены result'ы...


E>>даже variant<result1, result2, result3,...>


S>Т.е. даже вы пришли к этому самому варианту. Я контекста не знаю вашего, но мне кажется более простой схема с наследованием результатов из общей базы...


Но вариант — одна и рассматриваемых альтернатив. Я всё равно так и не понял, в чём цель (Зачем) разделения на reply и result.
Лично мне уже это место очень непонятное. Из какой функции что возвращать?
Вот вызываю я операцию Раз-Два. Она что вернёт? Успешный result, неуспешый result, какой-то комбинированный тип?
Я так понимаю, что речь идёт об обработке отказов на кодах возврата, а не на исключениях. Если это так, то по идее нужен какой-то универсальный тип результата, который вернут и при провале и при успехе и по которому можно будет понять, что вернули.
А иногда, мы этот результат хотим прокинуть между нитями. Тогда мы делаем какую-то функций врапер, которая зовёт обычную, заворачивает её result в reply и пересылает в другую нить.
А зачем такое разделение? Почему бы всем функциям не быть сразу же и враперами? С какой целью введён другой слой?
Такая примерно архитектура, или какая? Почему я должен за тебя придумывать контекст?

Кроме того, я понимаю, что контекст может быть большим, под соглашением о неразглашении и т. п.
Поэтому я и предложил тебе, так как думаю, что ты достаточно для этого квалифицирован, придумать альтернативные решения, если принять те или иные ограничения. На С, даже без классов почти весь юникс написали, например, и не жужжали при этом. Так что это вполне возможный расклад, предложить хорошие решения при таких ограничениях.
Это просто способ осознать достоинства и недостатки тех или иных подходов и осознанно выбрать самый удачный...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[6]: typename _Meta_quote_helper_<void, _Fn, _Types...>::type
От: Qbit86 Кипр
Дата: 06.07.18 13:16
Оценка: +3
Здравствуйте, Qbit86, Вы писали:

Q>Ты путаешь такие активности как использование библиотеки и изменения её внутренностей.


...И проявление такого непонимания — развернувшаяся в соседней ветке дискуссия. Нет ничего страшного, если в коде используется уже созданный шаблон из стандартной библиотеки типа std::variant; не надо его ничем заменять. (А при необходимости можно заменить вручную скрафченной «специализацией» по лекалу из стандартного std::variant.) Страшно, когда в обычном прикладном проекте появляется write-only код как из реализации этого std::variant. Если некто тащит такое в совместный с другими людьми проект просто потому, что может, и «хватит быть луддитами из девяностых» — это железобетонный признак профнепригодности. Это значит, человек не в состоянии оценить штрафы, которые подобный обобщённый код налагает на сопровождение общей кодовой базы.
Глаза у меня добрые, но рубашка — смирительная!
Re[7]: typename _Meta_quote_helper_<void, _Fn, _Types...>::type
От: smeeld  
Дата: 06.07.18 13:31
Оценка:
Здравствуйте, Qbit86, Вы писали:

Страшно, когда в обычном прикладном проекте появляется write-only код как из реализации этого std::variant. Если некто тащит такое в совместный с другими людьми проект просто потому, что может, и «хватит быть луддитами из девяностых» — это железобетонный признак профнепригодности. Это значит, человек не в состоянии оценить штрафы, которые подобный обобщённый код налагает на сопровождение общей кодовой базы.

Не знаю как у других, но сам везде встречал обязательное требование от прибывшего на проект разраба как можно быстрее въехать в код, каким бы он сложным не был, и нигде не втречал требование к разрабам писать кода "как можно проще, чтоб джуны и глупцы поняли". Второго требование не встречал по одной простой причине-глупцов и джунов на проекты не брали, а матёрым плюсовикам разобраться в чужом коде, каким бы он запутанным или обобщённым параметризацией ни являлся, если что и помешает то только лень, и ничего более, это не так уж и сложно как многим здешним хейтерам шаблонов кажется. Это тот же С++, а не какая-то неведомая инопланетная лингва, проблемы с въезжанием в код могут быть только у джунов, глупцов и лентяев.
Re[8]: Google C++ Style Guide
От: Qbit86 Кипр
Дата: 06.07.18 13:39
Оценка: 6 (1) :)
Здравствуйте, smeeld, Вы писали:

S>нигде не втречал требование к разрабам писать кода "как можно проще, чтоб джуны и глупцы поняли". Второго требование не встречал по одной простой причине-глупцов и джунов на проекты не брали


:) Тут за примером мне далеко идти не придётся — Google C++ Style Guide:

Avoid complicated template programming.

The techniques used in template metaprogramming are often obscure to anyone but language experts. Code that uses templates in complicated ways is often unreadable, and is hard to debug or maintain.

Template metaprogramming often leads to extremely poor compiler time error messages: even if an interface is simple, the complicated implementation details become visible when the user does something wrong.

Template metaprogramming interferes with large scale refactoring by making the job of refactoring tools harder. First, the template code is expanded in multiple contexts, and it's hard to verify that the transformation makes sense in all of them. Second, some refactoring tools work with an AST that only represents the structure of the code after template expansion. It can be difficult to automatically work back to the original source construct that needs to be rewritten.

Глаза у меня добрые, но рубашка — смирительная!
Re[8]: typename _Meta_quote_helper_<void, _Fn, _Types...>::type
От: Qbit86 Кипр
Дата: 06.07.18 13:45
Оценка:
Здравствуйте, smeeld, Вы писали:

S>каким бы он запутанным или обобщённым параметризацией ни являлся, если что и помешает то только лень


...И отсутствия x20 времени на разбор всех этих «typename _Meta_quote_helper_<void, _Fn, _Types...>::type», на которое согласились бы менеджеры. Вместо того, чтобы пилить конкретные фичи для пользователей, «разработчик» чешет своё самолюбие, осиливая «typename _Meta_repeat_n_c_<_Ty, make_index_sequence<_Count>, _Continue>::type», убеждая всех вокруг, что это нормально и несложно.
Глаза у меня добрые, но рубашка — смирительная!
Re[11]: Templates
От: so5team https://stiffstream.com
Дата: 06.07.18 14:09
Оценка:
Здравствуйте, Erop, Вы писали:

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


E>Так чтобы сравнивать, надо понимать как определены result'ы...


Не надо. Был показан простой код. В нем использовался простой фокус с шаблонами, который позволил написать вот так:
  template<typename Actual_Result>
  reply_t(request_id_t id, worker_id_t worker, Actual_Result && result)
    : id_{std::move(id)}, worker_{std::move(worker)}
    , result_{std::forward<Actual_Result>(result)}
  {}

а не вот так:
  reply_t(request_id_t id, worker_id_t worker, successful_result_t result)
    : id_{std::move(id)}, worker_{std::move(worker)}
    , result_{std::move(result)}
  {}
  reply_t(request_id_t id, worker_id_t worker, failed_result_t result)
    : id_{std::move(id)}, worker_{std::move(worker)}
    , result_{std::move(result)}
  {}

Но это же слишком просто для столь умудренных форумчан. Давайте развернем дискуссию о том, а уместно ли вообще применять std::variant? А подумал ли автор о том, что и successful_result_t, и failed_result_t можно обеденить? А может быть автор не подумал о том, что можно вообще без этих result-ов обойтись и все сразу запихнуть в reply? Да и с чего вообще автор решил, что ему нужны result-ы и reply-у?

Так вот, если вы хотите об этом всем поговорить и показать, как без этого обойтись, то возьмите и покажите. На самом деле не суть важно, какой именно набор полей в successful_result_t и failed_result_t. Так что ваша фантазия здесь ничем не ограничена.

И читать нужно всю тему, т.к. нет никакого резона пересказывать персонально то, что уже было рассказано выше. Но, если вы внимательно читать обсуждения не способны, то пусть будет такой контекст: один рабочий поток-менеджер берет откуда-то некий request и выбирает рабочий поток-обработчик, которому request будет передан. Рабочий поток-обработчик обрабатывает данные из request и отдает назад reply для того, чтобы потом-менеджер смог ответить на исходный request. В reply должен быть актуальный результат обработки данных. Этот результат на данный момент, может быть либо успешным (и тогда в нем будут обработанные данные), либо неудачным (и тогда там будет что-то касающееся причины неудачи). Возможно, что этот список будет расширен в будущем. Важно лишь то, что поток-обработчик должен точно сообщить что получилось, а поток-менеджер должен разобраться с тем, что ему возвратили.

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

Переводить стрелки на нас не нужно, т.к. мы свой выбор сделали. Естественно, обосновано. Поскольку вы можете иметь свою точку зрения, то интересно как раз услышать ваш взгляд.
Re[9]: Google C++ Style Guide
От: smeeld  
Дата: 06.07.18 14:14
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q> Тут за примером мне далеко идти не придётся 


У гугеля тысячи проектов и столько же команд. Та вывеска вообще ни о чём не говорит. Общался с некоторыми комитерами linux kernel и openbsd, работающими в гугеле, на С++ проектах, говорили что там весь код из многоуровых шаблонов, пишут точно в стиле либ из boost.

Встречал также интервью одного openbsd-ишника из РФ, тот отызвался уже о том, как пишут на С++ в Яндексе, то же про шаблоны говорил:

А: Про программистов на C++ ходит такой еще слух (нам, сторонним людям, очень интересно, что ты скажешь о слухах, которые ходят о Яндексе), что у вас там сплошные шаблоны на шаблонах, и метапрограммирование на шаблонах, ехал шаблон через шаблон. Это правда, или это в другом отделе, или этого вообще нет?

АЮ: Там есть стандартная библиотека своя. И в самих нутрях ее, конечно же, шаблоны, иначе ей невозможно пользоваться. И, порой, шаблон на шаблоне. А иногда и шаблон на шаблоне на шаблоне, это понятно. Но снаружи это не особо видно. То есть, один раз этот код написан. Он сложный, он шаблонизирован, но он отлажен, покрыт тестами, и, в принципе, на этом заканчивается. В прикладных программах, у тебя один шаблон, в смысле, вложенность. Ну, две, но не больше. Плюс, использование шаблонов, как замена функциональному программированию, особо не приветствуется из-за сложности отладки.

А: Метапрограммированию, наверное?

АЮ: Ну, и это тоже, да.

Re[10]: Google C++ Style Guide
От: Qbit86 Кипр
Дата: 06.07.18 14:22
Оценка:
Здравствуйте, smeeld, Вы писали:

S>Встречал также интервью одного openbsd-ишника из РФ, тот отызвался уже о том, как пишут на С++ в Яндексе, то же про шаблоны говорил:


«Но снаружи это не особо видно. То есть, один раз этот код написан... Использование шаблонов, как замена функциональному программированию, особо не приветствуется из-за сложности отладки.»
Глаза у меня добрые, но рубашка — смирительная!
Re[11]: Google C++ Style Guide
От: smeeld  
Дата: 06.07.18 14:25
Оценка:
Здравствуйте, Qbit86, Вы писали:

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


S>>Встречал также интервью одного openbsd-ишника из РФ, тот отызвался уже о том, как пишут на С++ в Яндексе, то же про шаблоны говорил:


Q>«Но снаружи это не особо видно. То есть, один раз этот код написан... Использование шаблонов, как замена функциональному программированию, особо не приветствуется из-за сложности отладки.»


И что? Либа-то написана, если иначе нельзя, то приходится возиться.
Re[10]: Templates
От: Erop Россия  
Дата: 06.07.18 14:31
Оценка: +1
Здравствуйте, night beast, Вы писали:

NB>ну мне кажется эти самые вопросы нужно было выяснять до того как называть код г-ном, не?

NB>явно это сказано не было, но смысл показался именно таким.
Разве я что-то говорил про чей-то код?

NB>в reply как раз и хранится вариант из результатов. или тебе не нравится что там кроме результата еще что-то хранится?

Мне не понятно, чем отличаются ответы и результаты концептуально...

NB>ну уже вроде говорилось что вызывающий код ничего не знает про различные варианты, знает только про свои.

NB>что до замены всего на динамический полиморфизм, то для такого решения должны быть какие-то причины а не просто желание избавиться от шаблонов.

Чем variant отличается от динамического полиморфизма? Тип объекта определяется его значением...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[12]: Templates
От: Erop Россия  
Дата: 06.07.18 14:38
Оценка:
Здравствуйте, so5team, Вы писали:

S>С обоими.

S>При том, что это апломб, а не констатация фактов.

Очень содержательное и, главное, понятное сообщение (оба раза)
Кстати, почему ты думаешь, что упражнение не полезное?

E>>IMHO, если человек вообще не может его выполнить он не особо квалифицированный программист...

S>Если вы думаете, что причина только в том, что "не может"
Я прямо сказал, что думаю, что ты сможешь, если захочешь... Читать в школе программирования на С++ не учили что ли?

S>и готовы давать оценки про "не особо квалифицированный", то разумно спросить: а вы-то сами кто? И, если совсем коротко, сколько в сантиметрах?

Не бери в голову, всё равно не поместится

E>>Про код же, если говорить, то пока так и не понятно, зачем нужны result и reply?

S>Тему перечитайте. Result -- это результат трансформации данных, не привязанный к тому, откуда эти данные пришли и кому их нужно отдать. А reply -- это result, который уже привязан к этой информации.

Это ответ на вопрос "почему?", а не "зачем?" Слово "зачем" подразумевает наличие осознанной цели...

E>>В чём цель существования такого разделения?

S>Так нужно было.
Понимаю. Рационализация у этого "нужно", хотя бы какая-то есть?



E>>Ещё интересно чем два разных result'a отличаются?

S>В них разная информация, ваш К.О.
Ну конкретно чем. Это результаты для любых операций? Если да, то интересно что такого хитрого обобщили. Или для каждой операции своя пара результатов?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[11]: Templates
От: night beast СССР  
Дата: 06.07.18 14:42
Оценка:
Здравствуйте, Erop, Вы писали:

NB>>ну мне кажется эти самые вопросы нужно было выяснять до того как называть код г-ном, не?

NB>>явно это сказано не было, но смысл показался именно таким.
E>Разве я что-то говорил про чей-то код?

как бы фраза

Это всего лишь означает, что ты не умеешь контролировать их "расползание" по коду...

была сказана именно при обсуждении кода.

NB>>в reply как раз и хранится вариант из результатов. или тебе не нравится что там кроме результата еще что-то хранится?

E>Мне не понятно, чем отличаются ответы и результаты концептуально...

ну, очевидно что в ответе кроме результата хранится дополнительная информация.
можно ее засунуть в результат, но зачем она там, если к результату не относится,

NB>>ну уже вроде говорилось что вызывающий код ничего не знает про различные варианты, знает только про свои.

NB>>что до замены всего на динамический полиморфизм, то для такого решения должны быть какие-то причины а не просто желание избавиться от шаблонов.

E>Чем variant отличается от динамического полиморфизма? Тип объекта определяется его значением...


как минимум отсутствием дополнительного оверхеда, связанного с умными указателями.
Re[12]: Templates
От: Erop Россия  
Дата: 06.07.18 14:47
Оценка: +1 -1
Здравствуйте, so5team, Вы писали:

E>>Так чтобы сравнивать, надо понимать как определены result'ы...


S>Переводить стрелки на нас не нужно, т.к. мы свой выбор сделали. Естественно, обосновано. Поскольку вы можете иметь свою точку зрения, то интересно как раз услышать ваш взгляд.


Я же написал. Без больших причин я бы не разделял result и replay
Вся конструкция целиком была бы не нужна...

Но, возможно я не понимаю, как используются результаты. Я так понимаю, что обычно всё равно возвращается что-то вроде варианта из результатов. Так что зачем
1) не сделать его же и параметром конструктора ответа
2) вообще отказаться от ответов, как идеи я не понимаю.

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

И да, я не хочу подтверждать или опровергать чью бы то ни было квалификацию. Я обсуждаю стили кодирования, а не людей.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[12]: Erop
От: Qbit86 Кипр
Дата: 06.07.18 14:50
Оценка:
Здравствуйте, so5team, Вы писали:

S>то разумно спросить: а вы-то сами кто?


(Он седой и строгий пятизнак, бывший старожилом на форуме задолго до того, как я сюда попал. А попал я сюда очень давно.)
Глаза у меня добрые, но рубашка — смирительная!
Re[12]: Templates
От: Erop Россия  
Дата: 06.07.18 14:51
Оценка:
Здравствуйте, so5team, Вы писали:

S>И читать нужно всю тему, т.к. нет никакого резона пересказывать персонально то, что уже было рассказано выше. Но, если вы внимательно читать обсуждения не способны, то пусть будет такой контекст: один рабочий поток-менеджер берет откуда-то некий request и выбирает рабочий поток-обработчик, которому request будет передан. Рабочий поток-обработчик обрабатывает данные из request и отдает назад reply для того, чтобы потом-менеджер смог ответить на исходный request. В reply должен быть актуальный результат обработки данных. Этот результат на данный момент, может быть либо успешным (и тогда в нем будут обработанные данные), либо неудачным (и тогда там будет что-то касающееся причины неудачи). Возможно, что этот список будет расширен в будущем. Важно лишь то, что поток-обработчик должен точно сообщить что получилось, а поток-менеджер должен разобраться с тем, что ему возвратили.


А откуда поток обработчик, берёт тот или иной result, разных типов, что бы завернуть это в ответ и отправить в поток-менеджер?
Эта функция, которую на потоке-обработчике вызывают, она как устроена? Она ловит исключения с провальным результатом или получает как результат успешный? Или как-то ещё сделано?
Почему полиморфный (тип зависит от значения) replay нужен, а result -- нет?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[13]: Templates
От: so5team https://stiffstream.com
Дата: 06.07.18 15:25
Оценка:
Здравствуйте, Erop, Вы писали:

E>Очень содержательное и, главное, понятное сообщение (оба раза)


В точности как у вас.

E>Кстати, почему ты думаешь, что упражнение не полезное?


Где говорилось, что оно не полезное? Только какой смысл заниматься этим упражнением в очередной раз нам, а не вам?

E>Это ответ на вопрос "почему?", а не "зачем?" Слово "зачем" подразумевает наличие осознанной цели...


Тему перечитайте.

E>Понимаю.


Не заметно.

E>Рационализация у этого "нужно", хотя бы какая-то есть?


Конечно.

E>Если да, то интересно что такого хитрого обобщили.


Блин, да вы пример исходный прочитайте внимательно. Там обобщен конструктор у reply_t. Хватит выдумывать воздушные замки.
Re[13]: Templates
От: so5team https://stiffstream.com
Дата: 06.07.18 15:34
Оценка:
Здравствуйте, Erop, Вы писали:

E>Я же написал. Без больших причин я бы не разделял result и replay


Ну так напишите, как бы вы представили reply. Исходя из своих соображений о прекрасном.

E>Так что мой ответ такой. Весь этот код не нужен


Ну так и начинать нужно было именно с этого. А то "не контролируешь распространение шаблонов", "есть полезное упражнение". По взрослому нужно: код не нужен и точка.

E>А откуда поток обработчик, берёт тот или иной result, разных типов, что бы завернуть это в ответ и отправить в поток-менеджер?


Представьте себе такой схематический код:
void transformer::handle(channel & reply_ch, const request & req) {
  try {
    auto transformed_data = some_external_function(req.source_data(), req.transformation_params());
    ... // Что-то еще.
    reply_ch.send(reply_t{req.id(), self_id(), successful_result_t{..., std::move(transformed_data), ...});
  }
  catch(const exception & x) {
    ... // Что-то...
    reply_ch.send(reply_t{req.id(), self_id(), failed_result_t{..., x.what(), ...});
  }
}

Станет легче?
Re[12]: Templates
От: Erop Россия  
Дата: 06.07.18 16:35
Оценка:
Здравствуйте, night beast, Вы писали:

NB>как бы фраза

NB>

NB>Это всего лишь означает, что ты не умеешь контролировать их "расползание" по коду...

NB>была сказана именно при обсуждении кода.
Если шаблоны возникают в неожиданных для программиста местах, помимо его воли целей и планов, а потому, что "так получилось", то это и значит, что в той парадигме, в которой программист работает, не получается контролировать расползание шаблонов по коду...
Есть какая-то ещё интерпретация того факта, что шаблоны возникают помимо воли программистов?

NB>как минимум отсутствием дополнительного оверхеда, связанного с умными указателями.

Зато есть оверхед связанный с лишними копированиями. Тут не известно что хуже, если честно. Зависит очень от "развесистости" результатов.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[13]: Templates
От: night beast СССР  
Дата: 06.07.18 16:51
Оценка:
Здравствуйте, Erop, Вы писали:

E>Есть какая-то ещё интерпретация того факта, что шаблоны возникают помимо воли программистов?


а кто говорил что они возникают помимо воли программиста?
речь была про то что изначально они не планировались, потом система эволюционировала.
что в этом такого необычного.

NB>>как минимум отсутствием дополнительного оверхеда, связанного с умными указателями.

E>Зато есть оверхед связанный с лишними копированиями. Тут не известно что хуже, если честно. Зависит очень от "развесистости" результатов.

с этим не спорю, но если результат очень развесист, что мешает его засунуть внутри в умный указатель?
а вот проделать обратное изначально спроектировав все на умных указателях будет труднее...
Re[14]: Templates
От: Erop Россия  
Дата: 06.07.18 17:01
Оценка:
Здравствуйте, so5team, Вы писали:

S>Представьте себе такой схематический код:

S>
void transformer::handle(channel & reply_ch, const request & req) {
S>  try {
S>    auto transformed_data = some_external_function(req.source_data(), req.transformation_params());
S>    ... // Что-то еще.
S>    reply_ch.send(reply_t{req.id(), self_id(), successful_result_t{..., std::move(transformed_data), ...});
S>  }
S>  catch(const exception & x) {
S>    ... // Что-то...
S>    reply_ch.send(reply_t{req.id(), self_id(), failed_result_t{..., x.what(), ...});
S>  }
S>}

S>Станет легче?
Так стало понятнее, но не до конца, если честно.
1) failed_result_t и successful_result_t где-то, кроме этой конструкции используются? Если да, то как, если нет, то опять не понято зачем два уровня классов (reply и xxx_reult)
2) Таких трансформеров много? У них у всех общий successful_result_t и общий failed_result_t или у каждого свои?
3) transformed_data всегда одного типа (во всех трансформерах?)
4) чем отличаются точечки в successful_result_t{..., std::move(transformed_data), ...}) от точечек в failed_result_t{..., x.what(), ...})?
5) Зачем reply_t вообще явно написанные конструкторы? Почему он не простая структура?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[14]: Templates
От: Erop Россия  
Дата: 06.07.18 17:05
Оценка:
Здравствуйте, night beast, Вы писали:

NB>а кто говорил что они возникают помимо воли программиста?

NB>речь была про то что изначально они не планировались, потом система эволюционировала.

потом система эволюционировала

Дык это и есть помимо воли программиста

NB>что в этом такого необычного.

Дык проблемы и сложности — это вообще норма жизни

NB>с этим не спорю, но если результат очень развесист, что мешает его засунуть внутри в умный указатель?

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

NB>а вот проделать обратное изначально спроектировав все на умных указателях будет труднее...

Почему? Чем вообще умный указатель на базу так сильно отличается от варианта из возможных наследников?
Только тем, что больше весит объект и на принимающей стороне должны знать все возможные варианты результатов...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[11]: Templates
От: alex_public  
Дата: 06.07.18 17:07
Оценка:
Здравствуйте, Erop, Вы писали:

E>Чем variant отличается от динамического полиморфизма? Тип объекта определяется его значением...


Реализацией аналога полиморфизма виртуальных функций на шаблонах является скорее вот эта https://www.boost.org/doc/libs/1_67_0/doc/html/boost_typeerasure.html библиотека. А std::variant — это всё же шаблонный аналог union, а не реализация полиморфизма.
Re[5]: Templates
От: Erop Россия  
Дата: 06.07.18 17:08
Оценка: +1
Здравствуйте, smeeld, Вы писали:

S>Понятно, что у того чего угодно должны быть строго определённые методы, но в остальном это действительно что угодно.

Соответственно и программа сможет сделать что угодно произвольным способом. Добро пожаловать в страну творческой отладки

S>А если это тупо удобно?

Удобно должно быть, в первую очередь, баги фиксить
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: Templates
От: Erop Россия  
Дата: 06.07.18 17:09
Оценка: +1
Здравствуйте, chaotic-kotik, Вы писали:

CK>Я очень часто встречал ситуации, когда тип параметризован, из-за этого код живет в *.h, любое его изменение приводит к перекомпиляции половины приложения, clang analyzer не кажет баги, в IDE не работает автодополнение. При этом всегда используется один и тот же параметр! На вопрос — а чО так, разработчик отвечает — а вдруг потом нужно будет? Преждевременная генерализация, это как преждевременная эякуляция, только хуже, т.к. за последнее не уволняют с работы.


Дык уневерсальный всемогутер -- самый мощный антипаттерн жеж
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[15]: Templates
От: so5team https://stiffstream.com
Дата: 06.07.18 17:22
Оценка: 5 (1)
Здравствуйте, Erop, Вы писали:

E>Так стало понятнее, но не до конца, если честно.

E>1) failed_result_t и successful_result_t где-то, кроме этой конструкции используются?

failed_result_t/successful_result_t описывают результат одной конкретной трансформации. Если трансформаций станет больше, то, возможно, появятся свои failed_result_t/successful_result_t для новых трансформаций. Или же эти будут переиспользованы. Это пока не ясно.

E>Если да, то как, если нет, то опять не понято зачем два уровня классов (reply и xxx_reult)


Это как разговор про T и std::vector<T>. Или даже T и std::unique_ptr<T>. Есть T сам по себе, важный с точки зрения прикладной логики, а есть контейнер для T нужный в каком-то случае. Вот reply -- это такой контейнер для result-а, который хранит result+еще что-то.

E>2) Таких трансформеров много? У них у всех общий successful_result_t и общий failed_result_t или у каждого свои?


Пока один. Что будет в будущем расписано выше.

E>4) чем отличаются точечки в successful_result_t{..., std::move(transformed_data), ...}) от точечек в failed_result_t{..., x.what(), ...})?


Разные наборы данных внутри. Разные наборы данных в конструкторе.

E>5) Зачем reply_t вообще явно написанные конструкторы? Почему он не простая структура?


Поскольку reply_t сам наследуется от еще одного базового типа.

Вообще, вот определение reply_t и сопутствующих типов (resize_result_t -- это reply_t и есть). Вот формирование reply. Сейчас там код разбит на две функции, начиналось все несколько по другому. И, кстати говоря, шаблонный конструктор позволил этого даже и не заметить. Вот обработка reply у менеджера. Можно обратить внимание, что отдельно обрабатывается одно поле из reply, и отдельно обрабатываются другие поля оттуда. Причем, в зависимости от result-а, обрабатываются по разному.

Код далеко не production-ready, это исследовательский прототип, который может поменяться в любую сторону.
Re[14]: Templates
От: Erop Россия  
Дата: 06.07.18 17:26
Оценка: +1
Здравствуйте, night beast, Вы писали:

NB>ну а по сути, твое предложение сводится к реализации std::variant собственными силами.

По сути он предложил взять простую структуру место трёх хитро взаимодействующих классов...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[15]: Templates
От: night beast СССР  
Дата: 06.07.18 17:30
Оценка:
Здравствуйте, Erop, Вы писали:

NB>>с этим не спорю, но если результат очень развесист, что мешает его засунуть внутри в умный указатель?

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

по поводу юз кейсов ничего не могу сказать.

NB>>а вот проделать обратное изначально спроектировав все на умных указателях будет труднее...

E>Почему? Чем вообще умный указатель на базу так сильно отличается от варианта из возможных наследников?
E>Только тем, что больше весит объект и на принимающей стороне должны знать все возможные варианты результатов...

умный указатель это всегда оверхед от его использования, а при передаче по значению пользователь сам решает, нужно ли ему это или нет.
Re[12]: Templates
От: Erop Россия  
Дата: 06.07.18 17:38
Оценка:
Здравствуйте, night beast, Вы писали:

NB>и потом этот variant будет муваться в член класса. итого 2 мува.

А зачем reply_t вообще конструктор?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[15]: Templates
От: night beast СССР  
Дата: 06.07.18 17:39
Оценка:
Здравствуйте, Erop, Вы писали:

NB>>ну а по сути, твое предложение сводится к реализации std::variant собственными силами.

E>По сути он предложил взять простую структуру место трёх хитро взаимодействующих классов...

по сути он предложил совершенно не связанные между собой классы поместить в одну кучу и предоставить пользователям самим разбираться, как эту кучу разгребать...
Re[13]: Templates
От: night beast СССР  
Дата: 06.07.18 17:42
Оценка:
Здравствуйте, Erop, Вы писали:

NB>>и потом этот variant будет муваться в член класса. итого 2 мува.

E>А зачем reply_t вообще конструктор?

конкретно в этом примере может и не нужен, а вообще -- инкапсуляция и все такое.
Re[16]: Templates
От: so5team https://stiffstream.com
Дата: 06.07.18 17:46
Оценка:
Здравствуйте, night beast, Вы писали:

NB>по сути он предложил совершенно не связанные между собой классы


На самом деле связанные, но взаимоисключающие. Т.е. они в принципе не могут существовать одновременно.

NB>предоставить пользователям самим разбираться, как эту кучу разгребать...


С возможностью контроля со стороны компилятора за обработкой всех вариантов (если применять std::visit).
Re[17]: Templates
От: night beast СССР  
Дата: 06.07.18 17:51
Оценка:
Здравствуйте, so5team, Вы писали:

NB>>предоставить пользователям самим разбираться, как эту кучу разгребать...


S>С возможностью контроля со стороны компилятора за обработкой всех вариантов (если применять std::visit).


речь не про тебя, а про альфу
Автор: alpha21264
Дата: 05.07.18
Re[2]: Templates
От: Erop Россия  
Дата: 06.07.18 17:52
Оценка:
Здравствуйте, vopl, Вы писали:

V>Самым ужасающим будет (скорее всего в c++20 не войдет, позже) Reflection. По сравнению с ним — текущие "шаблоны" — просто детский лепет. Так что, "большинству практикующих C++" придется либо переключить негатив c "шаблонов" на более ужасные вещи, либо, если они уж и впрямь сильно практикуют — расширить, включив туда, кроме "шаблонов" — еще и эти новые страшилки


Reflection -- это прикольно, но зависит от того, как сделают.
Что касается шаблонов, то главная проблема С++ шаблонов -- это очень большой периметр зависимостей. Нет никакого формального контролируемого описания интерфейса шаблона, поэтому шаблонный код получается с очень сильно завышенной связностью.
Так что концепты, например, тоже могут улучшить ситуацию, а не ухудшить...

Но главной, концептуальной, проблемы, это всё конечно не решит.
Концептуальная проблема устроена так, что обобщая по одному и даже по двум случаям, очень трудно угадать, как правильно обобщить, что бы упростить кода, а не усложнить его И это не связано напрямую с шаблонами, просто шаблоны провоцируют такой стиль.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[7]: typename _Meta_quote_helper_<void, _Fn, _Types...>::type
От: so5team https://stiffstream.com
Дата: 06.07.18 17:56
Оценка: +1
Здравствуйте, Qbit86, Вы писали:

Q>Страшно, когда в обычном прикладном проекте появляется write-only код как из реализации этого std::variant. Если некто тащит такое в совместный с другими людьми проект просто потому, что может, и «хватит быть луддитами из девяностых» — это железобетонный признак профнепригодности.


Тут вот какая штука. Сложный шаблонный код еще вовсе не показатель, что такой код не оправдан или написан ради демонстрации собственных возможностей. Применение шаблонов вполне может быть оправдано, но сложность их реализации может быть вызвана недостаточными выразительными возможностями C++. Вообще или конкретно той версии, на которую приходилось ориентироваться. Скажем, написать безопасный по типам printf во времена C++98/03 для переменного количества параметров было той еще задачкой (емнип, без макросов она решалась разве что тоннами копипасты). В C++11 за счет появления variadic templates это стало проще. Но если еще добавить к такому printf требование проверки соответствия типов в compile-time, то и возможностей C++11, afaik, не хватит. Но в С++14/17 какие-то подвижки в этом направлении уже могут быть. И то, что требовало титанических усилий раньше, со временем становится проще.

А ведь ряд бенефитов (например, безопасность по типам, контроль в compile-time) хочется получить уже сейчас. Ибо увеличение времени компиляции и сложность кода -- это, конечно, плохо. Но попадающие в продакшен баги из-за недостаточного контроля в compile-time могут быть куда дороже.
Re[12]: Templates
От: Erop Россия  
Дата: 06.07.18 18:01
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Реализацией аналога полиморфизма виртуальных функций на шаблонах является скорее вот эта https://www.boost.org/doc/libs/1_67_0/doc/html/boost_typeerasure.html библиотека. А std::variant — это всё же шаблонный аналог union, а не реализация полиморфизма.


Ну тогда и shared_ptr<base_result_t> аналог union. Отличается, только стратегией аллокации памяти же?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[6]: Templates
От: smeeld  
Дата: 06.07.18 18:09
Оценка:
Здравствуйте, Erop, Вы писали:

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


E>Удобно должно быть, в первую очередь, баги фиксить


Ещё со времён участия в проектах по разработке компонентов для solaris kernel, отлаживать привык трассировкой, поэтому в любую систему, которую случается развивать, закидываю мини аналог Dtrace собственного авторства. Мне общепринятые средства отладки без надобности, а используемый аналог Dtrace информативен в равной степени, независимо от того, расписан ли код на шаблонах или это Си.
Re[13]: Templates
От: alex_public  
Дата: 06.07.18 19:07
Оценка:
Здравствуйте, Erop, Вы писали:

_>>Реализацией аналога полиморфизма виртуальных функций на шаблонах является скорее вот эта https://www.boost.org/doc/libs/1_67_0/doc/html/boost_typeerasure.html библиотека. А std::variant — это всё же шаблонный аналог union, а не реализация полиморфизма.

E>Ну тогда и shared_ptr<base_result_t> аналог union. Отличается, только стратегией аллокации памяти же?

Нет, shared_ptr<base_result_t>, так же как и просто base_result_t* (не принципиально в данной дискуссии), так же как и boost::any из библиотеки по ссылке выше являются реализациями одной задачи (правда последняя реализация намного лучше остальных, т.к. boost::any позволяет объединять в себя типы не связанные иерархией наследования). Это задача бесконечного расширения обобщаемых типов. Ценой же этой возможности является дополнительных уровень косвенности (скрытый от программиста внутри реализации) при таком обобщённом обращение к конкретному классу.

А std::variant и union наоборот не позволяют бесконечно расширения обобщаемых типов — их список жёстко фиксируется на момент объявления нашего обобщённого типа и не может меняться без его переписывания. Зато при его использование никаких дополнительных уровней косвенности не возникает. Ну и плюс тут доступны не только функции-члены обобщаемых классов, но и переменные-члены.
Re[14]: Templates
От: Erop Россия  
Дата: 06.07.18 22:07
Оценка:
Здравствуйте, night beast, Вы писали:

NB>конкретно в этом примере может и не нужен, а вообще -- инкапсуляция и все такое.

Это же по сути структура?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[7]: Templates
От: Erop Россия  
Дата: 06.07.18 22:08
Оценка:
Здравствуйте, smeeld, Вы писали:

S>Ещё со времён участия в проектах по разработке компонентов для solaris kernel, отлаживать привык трассировкой, поэтому в любую систему, которую случается развивать, закидываю мини аналог Dtrace собственного авторства. Мне общепринятые средства отладки без надобности, а используемый аналог Dtrace информативен в равной степени, независимо от того, расписан ли код на шаблонах или это Си.


В С++ много кода вызывается неявно...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[15]: Templates
От: night beast СССР  
Дата: 07.07.18 03:45
Оценка:
Здравствуйте, Erop, Вы писали:

NB>>конкретно в этом примере может и не нужен, а вообще -- инкапсуляция и все такое.

E>Это же по сути структура?

не понял вопроса.
если от в том, нужна ли для reply_t инкапсуляция, но вопрос не по адресу.
Re: Templates
От: AleksandrN Россия  
Дата: 09.07.18 11:52
Оценка: +3
Здравствуйте, smeeld, Вы писали:

S>типа матёрый плюсовик всегда найдёт способ расписать без создания параметризованных типов,


Матёрый плюсовик понимает, когда лучше использовать шаблоны, а когда — лучше не использовать.

S>и вообще найдёт способ писать на C++ как можно проще


Код потом сопровождать надо будет. Поэтому — хороший разработчик на любом языке старается писать проще и не добавлять сложности без необходимости.
Re[2]: Templates
От: AleksandrN Россия  
Дата: 09.07.18 12:02
Оценка:
Здравствуйте, koenig, Вы писали:

K>лет так под 25 назад плюсовые компиляторы плохо работали с шаблонами

K>это нанесло глубокую душевную травму программистам тех времен, и они шаблоны избегали

Думаю, тогда шаблоны не избегали, а по сложившейся привычке, использовали макросы с параметрами вместо шаблонов.
Re[8]: Templates
От: smeeld  
Дата: 09.07.18 12:29
Оценка: +1
Здравствуйте, Erop, Вы писали:

E>В С++ много кода вызывается неявно...


Штук из STL и libstdc++ (типа dynamic_cast) старюсь избегать, все утилитарные сущности, вроде std::map/vector свои (вернее, скопипащенные и перепиленные под нужды). Также не сторонник пихать сложную логику в конструкторы и деструкторы.
Re[16]: Templates
От: alpha21264 СССР  
Дата: 09.07.18 13:52
Оценка: +1
Здравствуйте, night beast, Вы писали:

NB>>>ну а по сути, твое предложение сводится к реализации std::variant собственными силами.

E>>По сути он предложил взять простую структуру место трёх хитро взаимодействующих классов...

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


Ну ты пожалуйста всё читай.
Я же сказал, что по жизни в этой куче будет ровно один класс — класс успешного завершения.
Класс неуспешного завершения будет пустой. Поэтому в 99% случаев я могу обойтись одной кучей.

Течёт вода Кубань-реки куда велят большевики.
Re[8]: typename _Meta_quote_helper_<void, _Fn, _Types...>::type
От: Erop Россия  
Дата: 09.07.18 17:35
Оценка:
Здравствуйте, so5team, Вы писали:

S>А ведь ряд бенефитов (например, безопасность по типам, контроль в compile-time) хочется получить уже сейчас. Ибо увеличение времени компиляции и сложность кода -- это, конечно, плохо. Но попадающие в продакшен баги из-за недостаточного контроля в compile-time могут быть куда дороже.


Ну есть, как минимум три альтернативных пути,
1) Вообще не пользоваться printf, а сделать как-то совсем по другому. Как в cout, например. Тем более, что в printf свои типы всё равно фиг выведешь нормально...
2) Написать ориентированный на эту задачу предтранслятор/испектор кода.
3) Забить
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: Templates
От: Ops Россия  
Дата: 10.07.18 04:09
Оценка: +3
Здравствуйте, T4r4sB, Вы писали:

TB>Только чтоб считаться гуру, то помимо умения использования шаблонов нужно ещё умение неиспользования шаблонов.


А это со всем так, не только с шаблонами. Например, ударившись в ООП, забывают вообще про существование свободных функций и городят не пойми что, переусложняя код.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re: Templates
От: MasterZiv СССР  
Дата: 12.07.18 10:09
Оценка:
Здравствуйте, smeeld, Вы писали:

S>Заметил, что у большинства практикующих C++ достаточно негативное отношение к шаблонам в CPP. Речь идёт не о использовании std или boost, которые состоят из таковых процентов на 80, а о написании кода с активным применением параметризации функций и типов. Это многими считается чуть ли не признаком недостатка квалификации, типа матёрый плюсовик всегда найдёт способ расписать без создания параметризованных типов, и вообще найдёт способ писать на C++ как можно проще. Это вообще что такое?


Это просто называется твои выдумки.
Ты сам себе придумал, и теперь возмущаешься.
На практике просто есть разный код, разного назначения, есть библиотечный код с какими-то абстракциями, типа структур данных (например, деревья),
там шаблонный код уместен и нужен, а есть прикладной конкретный код, который связан, скажем, с программированием GUI, там шаблонный код
в общем не нужен, там всё вполне конкретное, и шаблоны могут только может использоваться.
Re[2]: Templates
От: smeeld  
Дата: 12.07.18 10:57
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>Это просто называется твои выдумки.


Ничего не придумывал, почитайте этот тред или этот
Автор: chaotic-kotik
Дата: 08.07.18
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.