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

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
  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 ASD_77, (Updated )

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

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

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

      А вот завузут метаклассы и интролспекцию... заживем
      Ответить
  • Я понял, эта программа переводит саму себя на "PHP" в "PHP" динамическая тупизация и нет перегрузки функций, потому перевод невозможен, а в "Forth"вообще безтиповый, для перевода придётся мутить систему типов и перегрузку-кукурузку.
    Ответить
  • То ли дело Си:
    #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;
    }
    Ответить
    • #undef bool
      typedef _Bool bool;
      Вот, кстати, что это за хуйня? Почему bool не тип, а мокрос?
      Ответить
      • Как зачем? Чтобы можно было сделать "undef". Поэтому я за "мокросы".
        Ответить
    • Это какой-то заготовленный набор мокросов, или ты с нуля наизусть это хуяришь?
      Ответить
      • Я уже давно так не хуярю.

        У меня накопилось несколько таких примеров. Я просто их изменял и сохранял в новый файл. И тёк.

        Ещё у меня где-то валяется недописанная библиотечка с подобными макросами с нарастающей функциональностью:
        - примитивы типа CAT QUOTE и всякие вспомогательные;
        - булева логика;
        - арифметика над 8-битными целыми в двоичном виде (без деления и множения);
        - условные мокросы IF, WHEN и UNLESS;
        - какая-то хуйня для объявления типов в виде: POINTER(POINTER(FUNCTION(void))) mas.

        Но в них имена другие.
        Ответить
          • Сезон течки закончился. Незнаю, могу и потечь немного, но пока повода нет.
            Ответить

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

Семь раз отмерь — один отрежь, guest!

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


    8