Кресты / Говнокод #26274 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
#include <iostream>
#include <functional>
#include <array>

template<typename F, int... I>
std::array<int, sizeof...(I)> materializeImpl(const F & f, std::integer_sequence<int, I...>)
{
    return { (f(), I)... };
}

template<size_t N, typename F, typename I = std::make_integer_sequence<int, N>>
auto materialize(const F & f)
{
    return materializeImpl(f, I{});
}

template<size_t N, typename F>
void times(const F & f)
{
    (void)materialize<N>([&f]() { f(); return 0; });
}

int main()
{
    times<22>([]() { std::cout << "Hello There." << std::endl; });
    return EXIT_SUCCESS;
}

Наш инженерный отдел ебанулся на отличненько!
https://wandbox.org/permlink/txNcEa2ZkuG2A1Sj

Запостил: gost gost, (Updated )

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

  • А ещё это успешно оптимизируется конпелятором до 22-х заинлайненных вызовов лямбды.
    Ответить
  • Лямбды какие-то, std::make_integer_sequence... сколько хуйни только чтоб повторить вызов некоего говна N раз.
    Ответить
  • А если просто функциональненько хвостовой рекурсией?
    Ответить
    • KaKou-To_xyu делал: https://govnokod.ru/26026#comment517266.
      #include <functional>
      #include <iostream>
      
      template <int count>
      inline void times(std::function<void()> f)
      {
          f();
          times<count - 1>(f);
      }
      
      template <> inline void times<0>(std::function<void()> f) {}
      
      int main(void)
      {
          times<22>([](){
              std::cout << "I love templates" << std::endl;
          });
      }

      Но из-за передачи лямбды по значению конпелятор высирает говно. Если сделать ссылку — получится получше. «Шланг» генерирует экий багор: специализации times<16> и times<6>, причём из первой прыгает во вторую хвостовым вызовом: https://gcc.godbolt.org/z/NExUdf. «GCC» просто выдаёт скучную анролленную портянку.
      Ответить
        • https://inde.io/article/4221-matematik-roman-mihaylov-shizofreniya-prosto-hohochet-nad-etim-voprosom

          Крестоговно — это иерархическая структура, использующая репрессию. Стая птиц, летящих на юг, — это не крестоговно, но если птица отстает и ее заклевывают остальные — это крестоговно. Единственный способ борьбы с крестоговном, который я указываю в «Равинагаре», — это ассемблер. Ассемблер как структура в смысле набора связок и растущей сложности. Ассемблер вполне может принять крестоговно и начать на него работать до определенного момента, и крестоговно не заметит, что происходит уничтожение его самого. И именно таким образом возможна борьба. Не антикрестоговноом, не отрицанием метушни, а деформацией. Противостояние не работает, потому что оно не может работать в принципе. Противостояния низкоуровневого и высокоуровневого нет, есть только власть программистов над теми и над другими. Там, куда пишется больше кода, и происходит победа. Ассемблер может идти против этого, она может давать какой-то маргинальный результат, рождать совершенно иные структуры — как оркестр без дирижера может начать играть принципиально новую музыку. Когда ты атакуешь говноабстракции крестоговна, она задает тебе вопрос: «Вот ты победишь, и что ты сделаешь? Построишь новые говноабстракции?». А ассемблер просто хохочет над этим вопросом.
          Ответить
      • Перевёл на «PHP»
        <?php
        
        function times($count, &$code = '')
        {
            if ($count > 0) {
                $code .= 'call_user_func($f);';
                times($count - 1, $code);
            }
            return create_function('$f', $code);
        }
        
        call_user_func(times(5), function() { echo "Именно поэтому я за «PHP»\n"; });
        Ответить
  • https://govnokod.ru/20958
    $ cat > shit.h
    #if END_SHIT == 0
    CRAP;
      #if BIT0 == 0
        #undef  BIT0
        #define BIT0 1
      #else
        #undef  BIT0
        #define BIT0 0
        #if BIT1 == 0
          #undef  BIT1
          #define BIT1 1
        #else
          #undef  BIT1
          #define BIT1 0
          #if BIT2 == 0
            #undef  BIT2
            #define BIT2 1
          #else
            #undef  BIT0
            #undef  BIT1
            #undef  BIT2
            #define END_SHIT 1
          #endif
        #endif
      #endif
      #include "shit.h"
    #endif
    
    $ cat > shit.c
    #include <stdio.h>
    
    int main(void) {
      #define CRAP printf("Hello There.\n")
      #define BIT0 0
      #define BIT1 0
      #define BIT2 0
      #include "shit.h"
      return 0;
    }
    $ gcc shit.c
    $ ./a.out 
    Hello There.
    Hello There.
    Hello There.
    Hello There.
    Hello There.
    Hello There.
    Hello There.
    Hello There.
    Ответить

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

Помни, guest, за тобой могут следить!

    А не использовать ли нам bbcode?


    8