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

    −18

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    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
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    87. 87
    88. 88
    89. 89
    90. 90
    91. 91
    92. 92
    93. 93
    94. 94
    95. 95
    #include <iostream>
    
    //
    #define PROGRAM i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,o,s,i,o,i,i,i,i,i,i,i,s,s,s,o
    //
    
    template <char n, typename Ns>
    struct Cons {
      static void print() {
        Ns::print();
        std::cout << n;
      }
    };
    
    struct Nil {
      static void print() {}
    };
    
    template <typename Ms, typename Ns> struct Append;
    
    template <typename Ns>
    struct Append<Nil, Ns> {
      typedef Ns String;
    };
    
    template <char m, typename Ms, typename Ns>
    struct Append<Cons<m, Ms>, Ns> {
      typedef Append<Ms, Ns> Next;
      typedef Cons<m, typename Next::String> String;
    };
    
    #define INS(name, expr) \
      struct name { \
        template <int n, typename Out> struct Result { \
          static const int value = expr; \
          typedef Out Output; \
        }; \
      }
    
    INS(i, n + 1);
    INS(d, n - 1);
    INS(s, n * n);
    
    template <int n> struct DecimalLoop;
    
    template <> struct DecimalLoop<0> {
      typedef Nil String;
    };
    
    template <int n> struct DecimalLoop {
      typedef DecimalLoop<n / 10> Next;
      typedef Cons<'0' + (n % 10), typename Next::String> String;
    };
    
    template <int n> struct ToDecimal;
    
    template <> struct ToDecimal<0> {
      typedef Cons<'\n', Cons<'0', Nil>> String;
    };
    
    template <int n> struct ToDecimal {
      typedef Cons<'\n', typename DecimalLoop<n>::String> String;
    };
    
    struct o {
      template <int n, typename Out> struct Result {
        static const int value = n;
        typedef typename Append<typename ToDecimal<n>::String, Out>::String Output;
      };
    };
    
    template <int n> struct Wrap {
      static const int value = n < 0 || n == 256 ? 0 : n;
    };
    
    template <typename... Is> struct Seq;
    
    template <typename I, typename... Is>
    struct Seq<I, Is...> {
      template <int n, typename Out> struct Result {
        typedef typename I::template Result<n, Out> A;
        typedef typename Seq<Is...>::template Result<Wrap<A::value>::value, typename A::Output> B;
        typedef typename B::Output Output;
      };
    };
    
    template <> struct Seq<> {
      template <int n, typename Out> struct Result {
        typedef Out Output;
      };
    };
    
    int main() {
      Seq<PROGRAM>::Result<0, Nil>::Output::print();
    }

    Запостил: dm_fomenok, 06 Марта 2017

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

    • что это?
      Ответить
      • Кто-то опять балуется с мета-погромированием. С виду это простой калькулятор, который умеет делать инкремент, декремент, возведение в квадрат и вывод результата в std::cout.
        Скука.
        Ответить
        • Так это же почти Брейнфак!
          Ответить
          • да, я как то про это же и подумал - транслятор бф в кресты. с constexpr строками или туплами? - интересно насколько быстро нагнется компилер.
            Ответить
        • а потом нубы читают такой код, и говорят что крестыговно, и идут писать на пхп
          Ответить
          • другими словами, кресты наконец таки достигли уровня перла?
            Ответить
            • Ещё нет. Осталось сделать так, чтобы линтер для плюсов принципиально невозможно было написать.
              Ответить
              • И чтобы компилятор тоже
                Ответить
              • > Ещё нет

                Ещё есть культурный фактор: писать непонятный простым смертным код умеет каждый перловик, а крестовые мета-заклинания — только особо упоротые крестолюбы.
                Ответить
                • покажи простому смертному визитер с парой адаптеров, и попроси описать что там происходит. а я пока буду стоять в сторонке, посмеиватся и "красненьким разминаться."
                  Ответить
                  • Ну если человек читал банду четырех то поймет даже визитор и даже flyweight
                    Ответить
                • то-есть обычный код на C++ чистый и понятный, да?
                  Ответить
                  • Да. Обычный код на C++ называется "си с классами". Он чистый и понятный. А крестошаблоны придумали анскиллябры заедушные, потому что они не хотят думать о том, как работает процессор.
                    Ответить
                    • правильно-ли я понимаю что все проблемы сей++ в шаблонах и метапрограммировании?

                      Я довольно хорошо умею ObjectiveC. Это тоже си с классами (ну и всякой лабудой типа лямбд)
                      Значит-ли что я могу быть хорошим крестовиком?
                      Ответить
                      • > Я довольно хорошо умею ObjectiveC

                        Думаете, в C++ много разных конструкций и возможностей языка? Вы просто не видели ObjectiveC++...
                        Ответить
                        • А его проапгрейдили до с++14? А то с++14 будет пожирнее, чем с++03 + objc.
                          Ответить
                    • ц препроцессор - ацтой. что у лиспа что у асмов - препроцы на порядок лучше, круче, удобнее, безопастнее и полезнее.
                      Ответить
                      • ну у асмов он не от хорошей жизни

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

                        куда без макросов?
                        Ответить
                  • > то-есть обычный код на C++ чистый и понятный

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

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

                    P.S. Меня недавно спросили, какой из опен-сорсных проектов можно почитать, чтобы посмотреть, как выглядит "хороший", "идиоматичный" плюсовый код. Честно говоря, я даже и не знаю, что ответить.
                    Ответить
                    • > P.S. Меня недавно спросили, какой из опен-сорсных проектов можно почитать, чтобы посмотреть, как выглядит "хороший", "идиоматичный" плюсовый код. Честно говоря, я даже и не знаю, что ответить.

                      а чем Qt и KDE не угодили? у них достаточно хороший стиль сырцов.
                      Ответить
                      • > Qt
                        > хороший, идиоматичный

                        lol
                        Ответить
                        • говно можно во всем найти. ну кроме helloworld.cxx что ли.
                          Ответить
                        • не, ну есть ку них пляска с метамагией, от неё никуда не денешься с таким функционалом.

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

                даже если линтер поймёт что ты написал, это еще не значит что ты сам понимаешь что ты написал.
                Ответить
                • Перловый код невозможно статически анализировать. Плюсовый вроде ещё можно.
                  Ответить
                  • перловый невозможно - не потому что синтакс сложный (к слову - синтакс у перла "относительно" простой (*)), а потому что нет доминирующего стиля программирования.

                    (*) парсер перла на бизоне сделан. 1+К строк. лексер сложнее и извращенее - но синтакс сам по себе на удивление детерминистический.
                    Ответить
                  • а все потому что не нужно мочалкой забивать гвозди

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

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