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

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
  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
// https://govnokod.ru/27340#comment621647

#include <iostream>
#include <cstdlib>

#define SPLICE(a,b) SPLICE_1(a,b)
#define SPLICE_1(a,b) SPLICE_2(a,b)
#define SPLICE_2(a,b) a##b


#define PP_ARG_N( \
          _1,  _2,  _3,  _4,  _5,  _6,  _7,  _8,  _9, _10, \
         _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, \
         _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, \
         _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, \
         _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, \
         _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, \
         _61, _62, _63, N, ...) N

/* Note 63 is removed */
#define PP_RSEQ_N()                                        \
         62, 61, 60,                                       \
         59, 58, 57, 56, 55, 54, 53, 52, 51, 50,           \
         49, 48, 47, 46, 45, 44, 43, 42, 41, 40,           \
         39, 38, 37, 36, 35, 34, 33, 32, 31, 30,           \
         29, 28, 27, 26, 25, 24, 23, 22, 21, 20,           \
         19, 18, 17, 16, 15, 14, 13, 12, 11, 10,           \
          9,  8,  7,  6,  5,  4,  3,  2,  1,  0

#define PP_NARG_(...)    PP_ARG_N(__VA_ARGS__)    

/* Note dummy first argument _ and ##__VA_ARGS__ instead of __VA_ARGS__ */
// note: using __VA_OPT__ shit instead ##__VA_ARGS__
#define PP_NARG(...)     PP_NARG_(_ __VA_OPT__(,) __VA_ARGS__, PP_RSEQ_N())

#define MK_VAR_T(type, name) \
typeof(type) name

#define TYPE_ADD_0()

#define TYPE_ADD_1(VAR) \
  MK_VAR_T VAR;
#define TYPE_ADD_2(VAR, ...) \
  MK_VAR_T VAR; TYPE_ADD_1(__VA_ARGS__)
#define TYPE_ADD_3(VAR, ...) \
  MK_VAR_T VAR; TYPE_ADD_2(__VA_ARGS__)
#define TYPE_ADD_4(VAR, ...) \
  MK_VAR_T VAR; TYPE_ADD_3(__VA_ARGS__)
#define TYPE_ADD_5(VAR, ...) \
  MK_VAR_T VAR; TYPE_ADD_4(__VA_ARGS__)
#define TYPE_ADD_6(VAR, ...) \
  MK_VAR_T VAR; TYPE_ADD_5(__VA_ARGS__)
#define TYPE_ADD_7(VAR, ...) \
  MK_VAR_T VAR; TYPE_ADD_6(__VA_ARGS__)
#define TYPE_ADD_8(VAR, ...) \
  MK_VAR_T VAR; TYPE_ADD_7(__VA_ARGS__)
#define TYPE_ADD_9(VAR, ...) \
  MK_VAR_T VAR; TYPE_ADD_8(__VA_ARGS__)
#define TYPE_ADD_10(VAR, ...) \
  MK_VAR_T VAR; TYPE_ADD_9(__VA_ARGS__)
#define TYPE_ADD_11(VAR, ...) \
  MK_VAR_T VAR; TYPE_ADD_10(__VA_ARGS__)


#define TYPE_ADD_(N, ...) \
  SPLICE(TYPE_ADD_, N)(__VA_ARGS__)

#define TYPE_ADD(...) \
  TYPE_ADD_(PP_NARG(__VA_ARGS__), __VA_ARGS__)

#define REM_BRACKET(...) __VA_ARGS__

#define LAMBDA(name, vars, code) \
struct name {TYPE_ADD vars void operator()() const REM_BRACKET code}

int main()
{
  LAMBDA
  (
    some_type_name,
    ((int, a), (float, b), (double, c)),
    ({
      std::cout << "Hello, world! " << a << " " << b << " " << c << std::endl;
    })
  );
  
  auto lambda = some_type_name(1, 3.14f, 0.25);
  lambda();
}

Вот вам говнолямбда на препроцессоре.

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

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

  • После препроцессинга такое выдается:
    struct some_type_name {typeof(int) a; typeof(float) b; typeof(double) c; void operator()() const { std::cout << "Hello, world! " << a << " " << b << " " << c << std::endl; }}
    Ответить
    • Можно написать код, который такую ебень хоть до 100500 нагенерирует через printf в цикле
      Ответить
        • Не, препроцессор не может дефайны генерить. Если в крестоговно добавят мегафичу - возможность из constexpr писать в файл - то тогда да, можно будет. Можно будет насрать этой хуйней в файл, а потом его заинклудить.
          Ответить
          • > не может дефайны генерить

            BOOST PP я вызываю тебя!

            Емнип, у них там какая-то ёбаная магия через рекурсивные инклуды была для этого.
            Ответить
    • // можно кстати переделать, чтоб вот так можно было делать
        auto lambda = LAMBDA
        (
          ((int, a, 1), (float, b, 3.14f), (double, c, 0,25)),
          ({
            std::cout << "Hello, world! " << a << " " << b << " " << c << std::endl;
          })
        );
      Ответить
      • // хотя не, можно вот тупо так, и переделывать нихуя не надо.
          auto lambda = LAMBDA
          (
            ((int, a = 1), (float, b = 3.14f), (double, c = 0.25)),
            ({
              std::cout << "Hello, world! " << a << " " << b << " " << c << std::endl;
            })
          ){};
        Ответить

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

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

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


    8