1. C++ / Говнокод #23376

    +4

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    SFINAE — это просто
    
    template<typename T> struct has_foo{
    private:  // Спрячем от пользователя детали реализации.
        static int detect(...);  // Статическую функцию и вызывать проще.
        template<typename U> static decltype(std::declval<U>().foo(42)) detect(const U&);
    public:
        static constexpr bool value = std::is_same<void, decltype(detect(std::declval<T>()))>::value;  // Вот видите, готово.
    };

    Программирование на "Modern C++" всё больше и больше становится похожим на отчаянную попытку выебать козла плазменным телевизором.
    via h/205772

    Запостил: gost, 30 Сентября 2017

    Комментарии (57) RSS

    • АААА МОИ ГЛАЗА!!!!!!!1!11
      Ёбаная крестушня
      Ответить
    • Просто это анскилябра кривая писала. Вот как надо:

      template<class T, class = void>
      struct has_foo : std::false_type {};
       
      template<class T>
      struct has_foo<T, decltype(std::declval<T>().foo(1488))> : std::true_type {};

      https://ideone.com/nggFFg
      Ответить
      • Nyet. https://ideone.com/VUwcpH
        Ответить
        • https://youtu.be/9r3u12H0y44?t=38
          Ответить
        • Надо было назвать zloi_foo, чтобы как в кино.
          Ответить
        • В этом оно не отличается от оп-поста, и обычно это желаемое поведение.
          Но у меня вот даже захачить получилось https://ideone.com/UH8XjX - правда это уже говно какое-то.
          Ответить
          • Охуеть, месье определённо знает толк в метушне!

            PS,
            s|// Вот видите, готово\.|// Вот видите, говно\.|
            Ответить
          • обычно надо проверить есть ли вообще foo принимающий аргументы ...Args. Тип возвращаемого значения интересует куда реже.
            Ответить
            • Нормальным программистам в нормальных программах "обычно" не нужно ни то, ни другое. А метапитуха тип возвращаемого значения должен интересовать, если он это значение собирается использовать (не в случае с void выше, конечно). Хотя тогда лучше возвращаемый тип проверять через is_convertible.
              Ответить
              • > Нормальным программистам в нормальных программах "обычно" не нужно ни то, ни другое

                по-твоему "нормальные программисты" просто пишут бойлерплейт или тьму макросов?

                > Хотя тогда лучше возвращаемый тип проверять через is_convertible

                в концептах как раз проверка не на конкретный тип, а на is contextually convertible.
                Ответить
                • Нормальные программисты решают реальные задачи. В реальных задачах ненужно проверять наличие метода на этапе конпеляции.
                  Ответить
                  • метушня нужна не "нормальным программистам" (которые, я так полагаю, занимаются тем, что реализуют тикеты в таскборде), а разработчикам библиотек, используя которые эти "нормальные программисты" смогут что-то реализовать чтоб оно работало быстрее питона

                    И вот им нужна проверка на наличие метода
                    Ответить
                    • Лол. Только в твоем метушином манямирке.
                      Что-то я сомневаюсь, что в спаннере или фотошопе есть хоть одна проверка на наличие метода на этапе конпеляции хоть в одной из зависимостей. Как же бедняши написали sqlite на своей сишке, если в ней нельзя метод на этапе конпеляции проверить и вообще методов нет? Как же реализовать интрузивный список или дерево без проверок методов на этапе конпеляции? Как же мы жили, пока деклтайп не завезли, страшно подумать.
                      Ответить
                      • я с тобой на 90% согласен. но - обощая - в крестах же ничего другого кроме как "на этапе кунпиляции" и нету. а народ хочет какую-нибудь динамику. вот и извращаются. вот поэтому буст из в года в год толще и толще становится. хоть какая-то динамика - даже если только на стади компиляции.
                        Ответить
                        • Я не слепо хейчу метушню, как могло показаться (только лолки все возводят в абсолют). Мне просто не нравится, когда метухи пишут оверинженерный нечитаемый понос там, где можно сделать просто. Ещё мне не нравится самомнение, отрастающее у метухов из-за того что они вызубрили свои метакостыли.
                          Что касается проверки метода на этапе конпеляции, то это почти наверняка в любой ситуации неуместное говно - я бы очень не хотел, чтобы мой метод просто молча не вызывался из-за опечатки в названии или сигнатуре.
                          Если еще не очевидно, я пишу с субару и фраушвайнхунд.
                          Ответить
                          • > Мне просто не нравится [...] оверинженерный нечитаемый понос там [...]

                            1) метушня это просто текущая мода.

                            2) это старая(*) неизлечимая болезнь, от которой разработка никогда никуда не денется.
                            (*) вспомни когда было сказано "premature optimization is root of all evil".

                            с другой стороны, оверинженеринг с опытом проходит. запомни: программа есть отражение того что происходит в голове разраба. (плюс вершн контрол: "и как происходит".) оверинженеринг это просто отражение недопонимания выполняемой задачи. (с другой стороны, иногда нихера не известно в начале проекта, и приходится оверинженерить что бы на дедлайне не парится.)
                            Ответить
                      • > Как же бедняши написали sqlite на своей сишке, если в ней нельзя метод на этапе конпеляции проверить и вообще методов нет?

                        писали больше кода. Я ж не говорю, что нельзя.

                        > Как же реализовать интрузивный список или дерево без проверок методов на этапе конпеляции?

                        в stl контейнерах есть проверки на is_noexcept_movable - проверки на наличие метода, по факту.

                        > Как же мы жили, пока деклтайп не завезли, страшно подумать.

                        в си же зачем-то завезли typeof. Видимо, без него сложно было
                        Ответить
                        • > в си же зачем-то завезли typeof. Видимо, без него сложно было

                          Это не в Си завезли, а сделали нестандартное расширение, которое поддерживает GCC, Clang и ICC под линупсами (емнип, ICC в линупсах мимикрирует под GCC, а в виндовсах под MSVC)
                          И применяется сия хуита в основном во всяких говномакросах, типа
                          #define max(a,b) \
                            ({ typeof (a) _a = (a); \
                                typeof (b) _b = (b); \
                              _a > _b ? _a : _b; })

                          Кстати обратите внимание, в этом говномакросе используется аж целых два нестандартных расширения:
                          https://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html
                          https://gcc.gnu.org/onlinedocs/gcc/Typeof.html
                          Ответить
                          • > Statement-Exprs.html
                            Да это же замыкания!
                            Ответить
      • > foo(1488)
        \0
        Ответить
    • в с++20 завезут концепты, и всякая подобная херня будет записываться в пару строк:
      https://wandbox.org/permlink/xN8VPaYXXhsf2emD
      Ответить
      • Интересно, какую еще ебанутую хуйню для плюсов придумают например в c++30 или c++50... Надеюсь что это дерьмо сдохнет раньше, чем наступит такой год
        Ответить
        • какую еще "ебанутую хуйню" придумаешь ты чтобы хейтить с++?
          Ответить
          • Имхо, самая важная "ебанутая хуйня" - с++30 невозможно будет изучить полностью.
            Ответить
            • А текущие стандарты ещё возможно?
              Ответить
            • Как C++ выучить, пацаны?
              Ответить
            • любой набор символов будет являться валидным кодом на С++30
              Ответить
              • Но всегда будет при этом UB.
                Ответить
                • Но в гцц будет специальное расширение, которое такой UB-код будет просто скармливать шестому перлу.
                  Ответить
                  • А msvc будет всегда выдавать захардкоженный экзешник, который через телеметрию пытается угадать, что хотел пользователь от данной программы.
                    Ответить
              • А он будет работать так же, как если его интерпретировать как код на J?
                Ответить
            • Скоро все опять вернутся к C++98 всем желаю дожить до 2098
              Ответить
            • Заканчивался 2025-й год. СТРАУСТРУП брёл по засыпанному неубранным снегом тротуару на интервью, неохотно отвечая на приветствия своих бывших коллег, стоявших в очереди к доширакомату и проклинавших десятиуровневую идентификацию. «Главное, чтобы они не догадались, куда я направляюсь», – размышлял наш герой, небезосновательно опасаясь конкуренции. Год для программистов выдался совсем печальным – искусственный интеллект окончательно заменил собой целую профессию, теперь заказчику было достаточно сказать: «ещё один Фейсбук», и нужный код моментально находился на облачном складе, далее менялись цвета и перетасовывались кнопки (дабы избежать обвинений в плагиате), и новый продукт поступал в продажу. Новые версии изготавливались по подобному же сценарию. Заправляли всем этим делом вовсе не программисты, а представители шоу-бизнеса, поднаторевшие на подобных перелицовках начиная ещё с 90-х годов. Разработчики 1С считали себя в безопасности, однако в предыдущем году Россия и Зимбабве последними в мире присоединились к унифицированной системе глобальной бухгалтерии. В военной сфере требовалась лишь поддержка ПО, и там прозябали 80-тилетние старцы с воспалёнными глазами.
              Ответить
              • ...
                Зато потребление достигло невиданных высот, держать в доме телевизор старше одного месяца считалось неприличным, новые модели активно привозились, а старые сдавались в утиль. Искусственный интеллект так и не осилил транспортных средств – то самолёт вмажется в небоскрёб, то автобус въедет в остановку, так что многие программисты переквалифицировались в шофёров. Именно в этой сфере деятельности и подвизался СТРАУСТРУП в последние несколько лет.

                Бизнес-центр ничем не отличался от своих собратьев: после стандартных антитеррористических процедур, включавших себя рентген, флюорографию, томографию, спектрографию и прочие «графии», так знакомые любому жителю этой поры, СТРАУСТРУП с трудом отбился от вагиноскопии и попал в комнату №101, ибо рисунок его радужной оболочки по ошибке совпал с данными одного известного биткойнодилера. К счастью, у СТРАУСТРУПА был с собой пистолет, голографическое фото на котором послужило надёжным удостоверением личности в просвещённый электронный век.
                Ответить
                • В скромном офисе СТРАУСТРУПА сразу же отвели в комнату для собеседований на должность шофёра. Огромный экран симулятора занимал всю стену, и на нём проигрывался ролик с рассказом о компании. Интервьюер вошёл неожиданно и сразу же приступил к делу.

                  – Итак, нам требуется драйвер. Нужно развозить новые модели бытовой техники и забирать старую. Владеете ли вы автоматической гирей? – так на модном полуанглийском именовалась коробка передач.
                  – Есть небольшой опыт, – отвечал СТРАУСТРУП. – Я всю жизнь имел дело с ручной, так что проблем не будет.
                  – Сомневаюсь. Я пробовал стик после автомата, и у меня... В самом деле, без высокоуровневых фреймворков сейчас никуда, с ними быстрее и удобнее Ладно, вот вам тестовое задание: развернуть строку… ой, я сам из бывших… нужно подъехать к дому и развернуть автомобиль так, чтобы он был припаркован задом наперёд.
                  – А зачем это?
                  – Проверить ваши навыки вождения. Сначала расскажите, какой подход примените.
                  – Ну, объеду квартал…
                  – Зачем это, достаточно же просто развернуться.
                  – Видите ли, я в последние годы был связан с высоконагруженностью – водил грузовик с прицепом…
                  – Считайте, что ширина дороги достаточная. Считайте, что у вас легковой автомобиль. Кстати, вы водили их последние версии?
                  – Нет, но…
                  – Сомневаюсь, что вы справитесь с замыканиями.
                  – Какими ещё замыканиями?
                  – Гудки режут слух, так что в современных моделях звуковой сигнал мычит. Так как же вы развернётесь?
                  – Ну, я подъеду, включу Reverse…
                  – Библиотечные функции использовать нельзя!
                  – А как же многопоточность? Водители из других полос вряд ли будут рады простаивать, пока я описываю большой круг.
                  – Это не главное. Нам важно, чтобы быстро. К сожалению, мы не можем вам предложить работу. Наши специалисты разворачиваются за пару секунд.
                  – Да не может быть!
                  – Смотрите, – и экзаменатор подошёл к симулятору. Разгон, удар по тормозам, управляемый занос, машина встаёт в обратном направлении…
                  Ответить
                  • На улице СТРАУСТРУП увидел большую пробку: грузовик с брендом компании, где только что был получен отказ, никак не мог развернуться. Осатаневшие водители гудели, мычали и просто матерились. Незадачливый шофёр высунулся из окна и крикнул СТРАУСТРУПУ:

                    – Братишка, я тебе покушать принёс! Посмотри, чтобы я задом ни в кого не въехал.

                    После серии тырканий туда-сюда, грузовику удалось-таки припарковаться. СТРАУСТРУП не удержался и задал вопрос водителю по поводу разворота путём управляемого заноса.

                    – Ты что, только что от нашего клоуна? – сообразил шофёр. – Это он так нашу кадровичку до метро подвозит, ей-то ничего не будет, она всё равно деревянная, а у меня в кузове 20 шестиметровых рулонов сданных телевизоров – побьются.

                    – Так ведь их же всё равно в утиль.

                    – Дурак что ли?

                    – А куда, в Африку?

                    – Ты ведь работу ищешь? Так? Ну пойдём, попробую поговорить, может, тебя возьмут…

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

                    – Вот смотри, – объяснял СТРАУСТРУПУ уже знакомый нам шофёр. – Клиенты один чёрт не помнят, что было год назад. Поэтому мы свозим их барахло сюда, выдерживаем 12 месяцев, потом приделываем шильдик новой модели и в путь!

                    – То есть как это?

                    – Ты что, еду сам не покупаешь? Когда у твоих любимых сосисок истекает срок годности, специальная тётка клеит свежую этикетку. Так и у нас… Постой здесь, я перетру с мастером…

                    СТРАУСТРУП был счастлив – его взяли на работу! Мастер тоже был из… бывших, долго гонял по способам сортировки просроченной продукции, предложил разработать алгоритм обхода склада, спрашивал, почему у них не стек, а очередь. В конце беседы похлопал по плечу:

                    – В нашем деле прежде всего нужно знать, чем равенство объектов отличается от equals. Клиенты в этом ни бум-бум, а мы этим пользуемся. Выходи после Нового года, будешь менять указатели, тьфу ты, шильдики. Хочешь смузи? Не боИсь, не просроченное… Десятилетней выдержки!..

                    Так счастливо закончилась эта удивительная история трудоустройства программиста.
                    Ответить
          • Мне-то как раз ничего придумывать не надо - причин хейтить плюсы и так достаточно. Да и хуйню, которую добавляют в плюсы(и из-за этой хуйни эти говноплюсы хейтят), добавляют не хейтеры, а всякие там говностандартизаторы.
            Ответить
            • # не хейтеры, а всякие там говностандартизаторы

              А вдруг говностандартизаторы тоже хейтеры?
              Ответить
              • Хейтер Вася много лет учился, вёл исследования, писал статьи, монографии и книги, в конце концов став многомудрым экспертом по "C++". Даже Александреску заявил, что «Вася немного разбирается в шаблонах» и посвятил его в Стандартизаторы. После чего хейтер-стандартизатор добавил в плюсы хуйню и стал хейтить их ещё больше!
                Ответить
        • В C++50 введут expression deduction:
          auto f = [](auto args...) -> auto { auto; };
          f(...);  // Вычислить нужный результат

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

          P. S. Правда, к тому времени все программы на всех других языках давно будут писаться нейросетями и искуственными интеллектами, и программисты будут нинужны. Но это уже совсем другая история...
          Ответить
          • Надо будет в 2050 году не забыть отписаться и спросить "Ну как, ввели?"
            Ответить
          • Да ну не рассказывай, не будет тако...
            Ответить
            • Наступил 2042 год. Мир окончательно превратился в набор облачных абстракций, где даже у дверных замков был свой API, а у табуреток — подписочная модель. Люди больше не знали, как устроены вещи; им было достаточно нажать кнопку «Сделать красиво», и нейросеть-дизайнер генерило новый интерфейс для кофеварки, основываясь на текущем эмоциональном фоне пользователя. Профессия инженера-конструктора вымерла, уступив место «промпт-менеджерам по эстетике», которые не могли отличить рычаг от шестерёнки, зато знали, как правильно подобрать эпитеты для генерации облаков.

              ЛИНУС сидел в углу старого, заваленного чертежами ангара, который он принципиально не подключал к глобальной сети. Он не признавал «умных» вещей. Если инструмент нельзя было починить кувалдой или понять, глядя на его физическую реализацию, ЛИНУС считал его «раздутым мусором».

              В ангар ввалился молодой специалист по «Low-code-дизайну», одетый в костюм из самоочищающейся ткани, которая, судя по всему, требовала обновления драйверов каждые пять минут.

              — Привет, Линус! — радостно воскликнул юноша. — У нас тут новый Pull Request! Мы решили обновить дизайн старых механических молотков. Мы добавили в них сенсоры давления, Bluetooth-модуль и интеграцию с облаком для анализа траектории удара!
              Ответить
              • ЛИНУС медленно поднял глаза. Взгляд его был тяжелым, как неоптимизированный бинарник.

                — Зачем мне молоток, который отправляет отчет об ударе в облако? — прохрипел он. — У меня удар по гвоздю. Гвоздь либо забит, либо нет. Если мне нужно составить аналитическую записку по динамике забивания, я найму бухгалтера.

                — Но это же... это же расширение функционала! — замялся дизайнер. — Теперь вы можете отслеживать историю своих ударов в приложении...

                — Это не расширение, — перебил его ЛИНУС, и в его голосе послышались нотки, от которых у бывших разработчиков в 20-х годах случался панический приступ. — Это раздутость. Это bloatware. Вы просто добавили лишние слои абстракции, чтобы скрыть тот факт, что вы не знаете, как работает сталь! Вы не можете даже написать драйвер для этого своего Bluetooth, я уверен!
                Ответить
                • — Ну, мы используем готовый фреймворк...

                  — Фреймворки! — ЛИНУС ударил кулаком по столу, отчего старая деталь, напоминавшая шестерёнку, жалобно звякнула. — Вы все только и умеете, что перекладывать функции из одной библиотеки в другую! «Сделайте мне молоток, чтобы он работал как сервис»! Я не принимаю этот запрос. Revert! Откатывай всё назад!

                  Дизайнер побледнел.

                  — Но мы же внесли изменения в репозиторий общих стандартов...

                  — Если в ваших изменениях нет ни одной строчки, описывающей физику взаимодействия металла с металлом, — ЛИНУС прищурился, — то это не изменения, а мусор. Я не буду это мержить. И даже не подходи ко мне с такими предложениями. Иди и поработай с чем-нибудь высокоуровневым. С облаками. С интерфейсами.

                  Дизайнер попятился к выходу, споткнувшись о старую, не подключенную к Wi-Fi наковальню.

                  — Постой! — крикнул он. — А если мы сделаем обновление, которое просто... ну, исправляет ошибки в предыдущем обновлении?

                  — У вас даже не было нормального базового кода, чтобы исправлять ошибки! — рявкнул ЛИНУС. — Вы используете BitKeeper для ведения списков инструментов! Это же несовместимо с моей системой архивации!

                  Дизайнер выбежал из ангара. ЛИНУС вздохнул, взял настоящий, тяжелый, не «умный» молоток и с глухим, низкоуровневым звуком ударил по гвозду. Гвоздь вошел в дерево. Никаких уведомлений. Никаких логов. Только чистая, нефильтрованная физика.

                  — Вот это я понимаю, — пробормотал он себе под нос. — Работает без зависимостей.

                  Где-то в облаке в этот момент упал очередной сервер, не справившийся с обновлением пользовательского соглашения, но ЛИНУС уже не слушал. У него был регрессионный тест на самовар, и этот тест не предполагал наличия интернета.
                  Ответить
    • Минутка интересных фактов:
      Метушня — с украинского «суета, суетня; хлопоты, хлопотня; суматоха, сумятица; сутолока».
      Спонсор этой минутки интересных фактов — проект Wiktionary: https://ru.wiktionary.org/wiki/метушня.
      Ответить
      • Хватит уже метушиться, метушки
        Ответить
        • Метушки разметушились,
          Но подраться не решились.
          Если сильно метушиться,
          Можно метушни лишиться.
          Если метушни лишиться,
          Нечем будет метушиться.
          Ответить
          • ... если сильно метушиться,
            UB может приключиться ...
            Ответить
            • ...
              Если UB вдруг приключится,
              Нечем будет метушиться.
              Ответить
      • >Метушня
        неактуальная_шутка_про_breaking_bad.тхт
        Ответить

    Добавить комментарий