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

    0

    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
    // my __enable_if
    template < typename T >
    struct __Conflict {};
    
    template <bool B, class T = void>
    struct __enable_if { typedef __Conflict<T> type; };
    
    template <class T>
    struct __enable_if<true, T> { typedef T type; };
    
    // Example of usage:
    template <typename T>
    class Lazy
    {
    public:
        void _ctor(bool b);
        void _ctor(typename __enable_if<!std::is_same<T, bool>::value, T>::type);
    };
    
    template <typename T>
    void Lazy<T>::_ctor(bool b)
    {
        std::cout << "bool " << b << std::endl;
    };
    
    template <typename T>
    void Lazy<T>::_ctor(typename __enable_if<!std::is_same<T, bool>::value, T>::type t)
    {
        std::cout << "T " << t << std::endl;
    };
    
    int main(int argc, char **argv)
    {
        Lazy<int> i;
        i._ctor(10);
        i._ctor(true);
    
        Lazy<bool> b;
        b._ctor(true);
    
        return 0;
    }

    Наговнокодил свой собственный "enable_if" который круче стандартного и дает возможность писать класный говнокод

    Запостил: ASD_77, 29 Октября 2018

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

    • Кому это интересно, обмылок?
      Ответить
      • Ололош уже поздно, иди спать
        Ответить
      • Программистам интересно
        Не забивай себе голову, иди спать
        Ответить
    • Никогда не понимао всю эту метушню...
      ...именно поэтому переведи на "Forth", ладно, переведи на "PHP".
      Ответить
      • Он пытается решить проблему того, что конструктор нельзя "выключить" с помошью std::enable_if. Заменяет тип аргумента конструктора на ересь, если условие false.

        Пускай теперь сделает тот же финт ушами с конструктором по умолчанию.

        А вот завузут метаклассы и интролспекцию... заживем
        Ответить
    • std::conditional
      Ответить
    • А в чем практический смысл Lazy<>?
      Ответить
    • Я понял, эта программа переводит саму себя на "PHP" в "PHP" динамическая тупизация и нет перегрузки функций, потому перевод невозможен, а в "Forth"вообще безтиповый, для перевода придётся мутить систему типов и перегрузку-кукурузку.
      Ответить
    • Поэтому я за "PHP".
      Ответить
    • То ли дело Си:
      #include <stdio.h>
      #include <stdbool.h>
      
      #undef bool
      typedef _Bool bool;
      
      #define PRIM_CAT(a, ...) a ## __VA_ARGS__
      #define CAT(...) PRIM_CAT(__VA_ARGS__)
      
      #define EAT(...)
      #define EXPAND(...) __VA_ARGS__
      #define EXPAND1(...) __VA_ARGS__
      #define IF(c) PRIM_CAT(IF_, c)
      #define IF_1(...) __VA_ARGS__ EAT
      #define IF_0(...) EXPAND
      
      #define CHECK_N(x, n, ...) n
      #define CHECK_(...) CHECK_N(__VA_ARGS__, 0)
      #define CHECK(...) CHECK_(__VA_ARGS__)
      #define PROBE(x) x, 1
      
      #define PRIM_TO_STR(...) # __VA_ARGS__
      #define TO_STR(...) PRIM_TO_STR(__VA_ARGS__)
      
      #define IS_SAME(x, y) CHECK(EXPAND(CAT(IS_, x)(y)))
      #define IS_bool(x) CAT(IS_bool_, x)()
      #define IS_bool_bool() PROBE(~)
      
      #define FORMAT(type) CAT(FORMAT_, type)
      #define FORMAT_int "%d"
      #define FORMAT_char "%c"
      #define FORMAT_bool "%d"
      
      void f_bool(bool b) {
          printf("fuckin bool %d\n", b);
      }
      
      #define DEF_F(type) \
      EXPAND1(EXPAND1(IF(IS_SAME(bool, type))()(\
      void CAT(f_, type)(type t) { \
          printf(TO_STR(type) " " FORMAT(type) "\n", t); \
      })))
      
      DEF_F(int)
      DEF_F(char)
      DEF_F(bool)
      
      #undef DEF_F
      
      int main(void) {
          f_int(256);
          f_char('X');
          f_bool(true);
          return 0;
      }
      Ответить

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