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

    Комментарии (43) 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
              Ответить
          • Мне-то как раз ничего придумывать не надо - причин хейтить плюсы и так достаточно. Да и хуйню, которую добавляют в плюсы(и из-за этой хуйни эти говноплюсы хейтят), добавляют не хейтеры, а всякие там говностандартизаторы.
            Ответить
            • # не хейтеры, а всякие там говностандартизаторы

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

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

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

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