- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
https://github.com/TartanLlama/optional/blob/master/optional.hpp#L853
/// Constructs the stored value with `u`.
/// \synopsis template <class U=T> constexpr optional(U &&u);
template <
class U = T,
detail::enable_if_t<std::is_convertible<U &&, T>::value> * = nullptr,
detail::enable_forward_value<T, U> * = nullptr>
constexpr optional(U &&u) : base(in_place, std::forward<U>(u)) {}
/// \exclude
template <
class U = T,
detail::enable_if_t<!std::is_convertible<U &&, T>::value> * = nullptr,
detail::enable_forward_value<T, U> * = nullptr>
constexpr explicit optional(U &&u) : base(in_place, std::forward<U>(u)) {}
/// Converting copy constructor.
/// \synopsis template <class U> optional(const optional<U> &rhs);
template <
class U, detail::enable_from_other<T, U, const U &> * = nullptr,
detail::enable_if_t<std::is_convertible<const U &, T>::value> * = nullptr>
optional(const optional<U> &rhs) {
this->m_has_value = true;
new (std::addressof(this->m_value)) T(*rhs);
}
/// \exclude
template <class U, detail::enable_from_other<T, U, const U &> * = nullptr,
detail::enable_if_t<!std::is_convertible<const U &, T>::value> * =
nullptr>
explicit optional(const optional<U> &rhs) {
this->m_has_value = true;
new (std::addressof(this->m_value)) T(*rhs);
}
/// Converting move constructor.
/// \synopsis template <class U> optional(optional<U> &&rhs);
template <
class U, detail::enable_from_other<T, U, U &&> * = nullptr,
detail::enable_if_t<std::is_convertible<U &&, T>::value> * = nullptr>
optional(optional<U> &&rhs) {
this->m_has_value = true;
new (std::addressof(this->m_value)) T(std::move(*rhs));
}
/// \exclude
template <
class U, detail::enable_from_other<T, U, U &&> * = nullptr,
detail::enable_if_t<!std::is_convertible<U &&, T>::value> * = nullptr>
explicit optional(optional<U> &&rhs) {
this->m_has_value = true;
new (std::addressof(this->m_value)) T(std::move(*rhs));
}
Я даже не знаю, какой конкретно фрагмент этого творчества сюда выкладывать.
https://github.com/TartanLlama/optional C++11/14/17 std::optional with functional-style extensions https://optional.tartanllama.xyz
Вообще меня это забавляет, все эти костылепостроения поверх плюсов. Сделайте там уже возможность в компилтайме работать напрямую с исходным кодом самого себя, т.е. чтобы был некий код, который плюсокомпилятором в компилтайме обрабатывался, и чтобы он принимал исходник самого себя просто в виде тупо текста, и мог произвольно менять содержимое исходника на этапе компиляции (не меняя при этом сами файлы в файловой системе), и чтоб в качестве библиотек к этому компилтайм-метушению шел лексер-парсер плюсов.
Понятно что из плюсов никакого гомоиконного лиспа сделать не выйдет, ведь тогда надо выкинуть очень красивый и элегантный плюсосинтаксис вида std::kukarek(std:kudah<std:kokoko{kokoko ko[hui<govno>]}>:()[*huita]{}) и заменить его на бездуховные скобочки
-- А почему со вкусом Си? Может быть можно было со вкусом C#?
-- C#? А что, можно было?
Надо было подождать
Как же ТАКОЕ могло случиться со мной?!
https://github.com/ned14/outcome/blob/boost_peer_review3/include/boost/outcome/v1.0/detail/basic_monad.ipp
Раз уж подняли эту тему, вот памятник метушиного искусства, который выглядит странно даже по крестоблядским меркам - помимо обычной крестометушни там еще кодогенерация через определение макросов и инклуд "шаблона". Это реализация утилитарного класса наподобие optional. Автор пытался пропихнуть это в буст, но его зачморили, и он с подгоревшей жопой убежал все переписывать. Вообще история отношений nial'а и буста очень грустная и преисполнена батхерта. Странный он парень.
Свежие ревизии этой библиотеки тоже можно почитать, но там все не так прикольно, обычная крестоебля.
Вспомнилась байка про старца в комитете с++, который всё время спал а потом посреди доклада говорил "А тут бах и исключение!"
> Сделайте там уже возможность в компилтайме работать напрямую с исходным кодом самого себя
Саттер метаклассы продвигает, не оно? Или тебе нужен говнокодогенератор, но внутри языка?
Именно! Ведь тогда можно не допиливать каждый раз все компиляторы под новые говнофичи плюсов при выходе нового стандарта, а все эти говнофичи реализовывать через этот самый говнокодогенератор. Можно будет даже новые операторы и ключевые слова добавлять при желании, весь код перед обычной компиляцией может сколько угодно раз пропускаться через особую кодогенерирующую плюсовую метушню(старая метушня может сгенерировать новую метушню, через которую весь код опять будет пропускаться), которая бы добавляла в плюсы какие-нибудь новые хрени, типа всяких там лямбд-хуямбд, т.е. чтоб можно было бы даже синтаксис РАСШИРИТЬ, добавив например каких-нибудь триграфов, которые в C++17 собираются убрать
govnokod.ru/23449#comment392370
p.s. надеюсь ты не дальтоник
Для розыгрыша тританопов (более редкая патология, обычно приобретается, если долго смотреть на сварку) нужно сочетание чёрного с синим.
синий текст
зелёный текст
красный текст
чёрный текст
жёлтый текст
Только реализовывать это будет достаточно один единственный раз для всех компиляторов.
Напоминаю, что компиляторов МНОГО, и если к каждому писать реализацию хуйни, то это будет сложнее написания общей хуйни для всех компиляторов через метушню.
> Ведь type deduction guides это говнометушня, куда лучше писать свой парсер языка чтобы получить поведение vector v = {1,2,3}; И как комитет до этого не додумался?
Этот ваш плюсовый type deduction - говно. Например, есть такая штука, как типизация по Хиндли-Милнеру, зависимые типы. Когда такое в плюсах сделают? Этот ваш плюсовый говнокомитет только и умеет, что какие-то кривые костыли сбоку привинчивать ржавыми болтами
А тебе какая разница? Ты же всё равно на плюсах не пишешь.
Неужели на асме правда пишут больше чем на swift?
мне напомнило про вот это:
http://seed7.sourceforge.net/manual/syntax.htm#The_syntax_of_a_statement
но я думаю что таких "макросов" в крестах мы еще долго не увидим, потому что не метушня.
Не очень хорошо знаю аспекты. Насколько я понимаю, это инструмент для вставки кода в нужные места согласно описанным условиям.
Если так, то расширить функционал и языка получится (например, встроить проверку границ в сишные массивы?), а синтаксис изменить - нет.
> ssed7
> Seed7, on the other hand, additionally allows user defined constructs
> The definition of the 'loop' function (semantic definition of the loop-statement) is:
Глянул ссылку. Целиком не прочитал, но на первый взгляд похоже на то, что я хочу.
Надо повнимательней посмотреть будет. Интересно, как там обрабатывается заматченная циклическая и рекурсивная питушня (например, даже обычная регулярка /(?:([a-z])+:([a-z])+;)+/ на строке "a:b;ccc:dd;zzz:zzw" в идеале должна породить иерархический вывод [[['a'],['b']],[['c','c','c'],['d','d']],[['z','z','z'],['z','z','w']]], но мы увидим только ['z','w'] в популярных реализациях)
хез. какой-то пасквилянт уже много лет это дело неустанно пилит (да, это буквально one man project). раньше чисто интерпретировался язык - теперь вроде на llvm пытаются посадить. я одним глазом поглядываю - потому что эти "макросы" весьма привлекательная фича. как именно эти макросы выжывают вложенность я не в курсе (но логично было бы ожидать что будут работать, а то иначе - говно).
> но мы увидим только ['z','w'] в популярных реализациях
новые регулярки только матчат рекурсивно (ака бэктрекинг) - капче группы всегда были статическими. иначе же ты их не пронумеруешь (sed/perl/etc - \1, \2, этц), тебе понадобится какое подобие xpath'а для этого. и это сложно.
Потом они захотят многопоточность в компилтайме, и файлы читать в компилтайме, и вообще чтоб в компилтайме оно еще и отсасывать программисту могло (хотя оно и так сосет, образно).
Впрочем, что тебе мешает самому себе сделать новый язык? Если ты такой мировой эксперт и прекрасно знаешь каким идеальный яп должен быть?
(1) потому что могут.
(2) потому что это опциональные фичи которые тебя никто не заставляет использовавать.
(3) потому что добавляются в язык посредствов стандартной библиотеки, не ломая обратной совместимости.
Всё немного не так.
1. Говностандартизаторы добавляют в плюсы очередную говнофичу
2. Какие-то говнокодеры пишут говнокод с использованием говнофичи и выкладывают его в опенсорс
3. Программист Вася использует программу, написанную говнокодерами, в котором используется говнофича
3.1. Программист Вася сталкивается с необходимостью что-то в программе поменять, дабы адаптировать под свои потребности, или пофиксить баги
3.2. Программист Вася вынужден разбираться с говнофичей, придуманной плюсовыми говностандартизаторами, т.к. говнокод написан с использованием данной говнофичи, и выбора у него нет.
Т.е. можно конечно сказать, что программист на плюсах вообще не обязан знать плюсовую стдлибу, ведь можно на плюсах как на Си писать. Но на деле же, программисту на плюсах по роду своей деятельности придется иметь дело с кодом, в котором стдлиба плюсов используется, независимо от того, нравится ли ему плюсовая стдлиба или нет. Т.е. когда говнокомитет запиливает говнофичу, несомненно будет появляться говнокод с данной говнофичей, и программисты на говноплюсах эту фичу должны знать, т.к. им надо весь этот говнокод с говнофичами уметь читать-писать-понимать, за ковыряние в этом говне им зарплату платят
понимаю аргумент.
но на практике, даже голый ц все еще жив и процветает. и это как раз по причине что большинство разрабов - так или иначе - следуют принципу KISS.
тот же Duff's Device в ц трендом не стал - точно так же крестовая метушня после хайпа выродится в н-ное количество обычных простых примочек.
подавляющее большинство разрабов - пых, жаба, кресты или шарпы - народ весьма немудрёный и этой петушнёй/метушнёй коммерчески пользоватся просто не будут, потому что она для них слишком сложная.
поэтому то я лично (1) спокойно игнорирую метушню, (2) за будущее человечества не волнуюсь.
Лол. Уже 15 лет хайп. Когда же уже выродится?
15 лет назад - народ еще мучался банальным хаосом разных несовместимых версий STL и кривой поддержкой оных в компилерах.
Книжка александреску появилась в 2001, буст мпл появился в первой половине нулевых - все тогда было уже.
темплейт сам себя использует.
раньше тоже можно было, но было не практично из-за ограничений с++03.
в новых версиях ограничения убрали, и добавили вариадики. теперь это стало практично.
вот это? http://coliru.stacked-crooked.com/a/d17f23ad814e965fp
другой вопрос - нахуя
(2) ты спрашиваешь меня о коде 10-ти летней давности который жил ~1 день, и был викинут потому что либо не компилировалось, либо был verbose до бесполезности.
я тут один только что ли помню старые кошмары когда авто-выведение типов было никакое?
Авто-выведение по стандарту или в твоём компиляторе от ВасянИнкорпорэйтед? Как авто-выведение в шаблонах изменилось с C++98 (кроме добавления вариадиков, разумеется)? Вроде мало серьёзных изменений до C++17
с++ программисты имеют странную тенденцию даже не читать сообщения об ошибках. Они беспомощно смотрят на стену текста и говорят себе "а, ну значит так нельзя".
Потому что обычно лень читать эту стену из мусора и мыслей конпелятора...
Вот помнится писал на конфе "лабу" на ranges, так там прога на 20 строк компилилась пару минут и в случае если что-то не так выдавала 100+ строк кода. И это при том, что ошибку ловил static_assert. Ждем концепты
> ошибку ловил static_assert
> Ждем концепты
Необучаемые крестобляди.
Откуда строки в крешдампе? Там же гигабайтики из оперативки...
ты так высокомерно говоришь наверное потому что ты еще монументальных факапов не видел, и на тебя не вешали ответственности их "до конца недели" газгребать. через пару раз начинаешь понимать почему 100 строчек тупого кода лучше 10 строчек умного.
Видел. У нас прекратили поддержку двух проектов из-за того, что вместо десятков строк умного кода лепили сотни тупого, и правили баги/добавляли фичи костылями из сотен столь же тупого кода. Один отдали мне переделать с нуля, чем я и занимаюсь последний год. Второй я рефакторил по частям по мере необходимости, но он окажется там же, если не умрет из коммерческих соображений.
И вот что я скажу: если STL предоставляет мне инструмент, идеально подходящий для выполнения той или иной задачи, я воспользуюсь им не задумываясь. И не потому, что "читать 10 строк сложного кода проще чем 100 простого" или наоборот. А потому, что в отличие от костыльных самоделок, на STL есть отличная документация и в нем нет багов. Не знаешь что делает std::whatever? Идешь на en.cppreference.com (кстати, его доку можно и в ide встроить). Не знаешь что делает вон тот трехмерный цикл с 15-ю переменными? Идешь читать/на хуй/пить/бить морду автору (нужное подчеркнуть). Но самая большая разница в другом. Увидев std::whatever, использованный по другому, я сразу буду знать что он делает. А вот увидев новый трехмерный цикл с 15-ю переменными что делать будешь? Разбираться с нуля. И самое главное: в случае ошибки лаконичный код легче понять, чем переписать с нуля.
> А вот увидев новый трехмерный цикл с 15-ю переменными что делать будешь?
это не тупой код - это убогий и/или кривой код.
> лаконичный код легче понять
ты называешь метушню лаконичной?..
я думаю что у нас определение "тупого кода" различные. твое определение склоняется к "глупому/кривому/убогому коду", в то время как мое скланяется к "явный, открытый и не подкопаешься" (и "лаконичный код" это верх совершенства в определении моего "тупого кода").
> У нас прекратили поддержку двух проектов из-за того, что вместо десятков строк умного кода лепили сотни тупого [...]
а ты уверен что там десятком/сотней строк обошлось бы?
если бы ты стоял у истоков проекта - у тебя бы хватило смелости взять на себя ответственность сделать "умно"? и самое главное: хватило бы у тебя совести проект до конца довести после того как "умное" облажалось?
если код убогий - но концепция правильная - то выровнять это часто пара дней/недель с регулярками в виме. но если у тебя там концепция кривая - или она в принципе из-за требований пользователей нераспрямляемая - то тогда умный код тебе будет только мешать. потому что в 10 строк умного кода встявить костыль на порядки сложнее - чем вставить костыль в 100 строк тупого кода.
Как правило код худеет в 2-3 раза. Бывало что в10.
А зачем выдумывать что-то сложное?
Надо просто взять, и вписать еще один if в тридцать семь мест. Разве сложно?