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

    +5

    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
    #include <iostream>
    #include <type_traits>
    #include <list>
    #include <vector>
    
    using std::cout;
    using std::endl;
    using function = int;
    
    struct Console {
    private:
        template<typename SS, typename TT>
        static auto test(int)
            -> decltype(std::declval<SS&>() << std::declval<TT>(), std::true_type());
        template<typename, typename>
        static auto test(...) -> std::false_type;
        template<typename T>
        static const bool canCout = decltype(test<decltype(cout), T>(0))::value;
    public:
        template<typename T>
        typename std::enable_if<std::is_same<decltype(std::declval<T>().begin()),
            decltype(std::declval<T>().end())>::value && !canCout<T>>::type
        log(T arg) {
            log('[');
            for (typename T::const_iterator it = arg.begin(); it != arg.end(); ++it) {
                auto nextIt = it;
                ++nextIt;
                if (nextIt != arg.end()) {
                    log(*it);
                    log(", ");
                } else {
                    log(*it);
                    log(']');
                }
            }
        }
        template<typename T>
        typename std::enable_if<canCout<T>>::type
            log(T arg) {
            cout << arg;
        }
        template<typename H, typename ... T>
        void log(H arg, T... rest) {
            log(arg);
            log(' ');
            log(rest...);
        }
    };
    static Console console;
    
    function main()
    {
        console.log(std::vector<int>({ 1, 2, 3 }), "Hello World!", 100.1, "\n");
        console.log(std::string("std::string"), std::list<std::string>({ "one", "two", "three" }), '\n');
    
        return 0;
    }

    Javascript++.
    https://ideone.com/NykL0u

    Запостил: gost, 21 Октября 2017

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

    • #define function auto
      для универсальности
      Ответить
    • js console.log же не принимает более одного аргумента?
      Ответить
      • Принимает, даже умеет console.log("%d = %s", 2, "2"); исполнять как сишный printf("%d = %s", 2, "2");
        Вот на другую строку переходит - это да, тут '\n' явный не нужен (хотя, тогда придётся существующий код с шаблонами переписать).
        Ответить
        • > как сишный printf
          Типичная динамическая питушня. Хочешь вывести 3 числа - ок, пожалуйста. Хочешь вывести 3 строки с произвольным содержимым, а они почему-то иногда друг в друга втыкаются... Вот нахуя было смешивать 2 функции с разной семантикой в одну?

          З.Ы. Напомнило про ёбнутый конструктор у Array, где тоже смешали 2 разных семантики.
          Ответить
          • Перегрузка, что с неё взять.
            Но в случае с console.log это особо не мешает, чаще работает как фича.
            > console.log("%d + %d =", 2, 2, 4)
            2 + 2 = 4

            С массивом - боль, да. Хотя, есть ли ситуации, когда это нельзя заменить на []? В голову приходит случаи неизлечимого катаморфизма головного мозга.
            var map = (f, xs) => xs.reduce((xs, x) => xs.concat([f(x)]), []); // вроде и тут не нужен
            Ответить
          • >Вот нахуя было смешивать 2 функции с разной семантикой в одну?
            Разная семантика это форматная строка и сложение строк параметров?
            >Хочешь вывести 3 строки с произвольным содержимым, а они почему-то иногда друг в друга втыкаются...
            Можно подробнее для неофитов?
            Ответить
            • >> Хочешь вывести 3 строки с произвольным содержимым, а они почему-то иногда друг в друга втыкаются...
              > Можно подробнее для неофитов?
              Хотим смотреть, что ввёл пользователь:
              console.log(input11.value, input12.value, input13.value);

              Сначала пользователь ввёл "Иванов", "Иван", "Иванович".
              А потом - "0x%da%f4", "691", "4".
              В первом случае распечатается как ожидал программист, во втором - совсем по-другому.
              Ответить
    • https://ideone.com/axKWxF
      Упомянул ininializer_list, чтобы не писать явно, что это массив. Теперь можно так:
      console.log({ 1, 2, 3 }, "Hello World!", 100.1, "\n");

      P.S. Пирфоманс я слил.
      Ответить
      • Console::log<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >,
        std::__cxx11::list<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >,
        std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, char>(std::__cxx11::basic_string<char,
        std::char_traits<char>, std::allocator<char> >, std::__cxx11::list<std::__cxx11::basic_string<char, std::char_traits<char>,
        std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, char)

        Красота!
        Ответить
        • Какой же всё таки с++ охуенный. Сразу чувствуется что это язык для умных людей
          Ответить
        • Но что же это значит, gost?
          Ответить
          • Любому здравомыслящему человеку с первого взгляда очевидно, что это выражение сворачивается в:
            Console::log<std::string, std::list<std::string>, char>(std::string, std::list<std::string>, char)
            .
            [‎‎‏/color]
            Ответить
      • https://ideone.com/XcD40d
        Расширил, отрефакторил и поправил пирфоманс.

        Проблему с несколькими ininializer_list решить не удалось; господа метухи, что думаете?
        Ответить
    • Портировал напитон:
      class console:
          def log(*args): 
              print(*args)

      https://ideone.com/Rg3i4y
      Ответить
      • во-первых self все таки лучше писать
        во-вторых класс лучше называть большой буквы (пеп8)
        в-третьих print() пишет в stdout, а это совершенно не обязательно консоль. И я даже не о пайпах и шеловых редиректах. Я мог бы сейчас завести километровую ветку про разницу между консолью и терминалом в разных ос, но не буду
        Ответить
        • Если написать self или с большой буквы - никакой магии никакого Javascripthon'а не произойдёт!
          Ответить
        • > но не буду
          Лучше будь, в паре-тройке постов, как ты любишь.
          ------------------
          см. далее -->
          Ответить
    • Динамическая питуизация! http://govnokod.ru/23442
      Ответить
    • Добавил поддержку std::pair и std::map: https://ideone.com/Bc7uf1
      Ответить

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