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

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
  90. 90
  91. 91
  92. 92
  93. 93
  94. 94
  95. 95
  96. 96
  97. 97
  98. 98
  99. 99
#include <stddef.h>
#include <stdio.h>
#include <utility>
#define PLACEHOLDER char x[0];

#define FORCEINLINE 
template <typename T, typename... Ts> struct MyTuple : MyTuple<Ts...>
{
	FORCEINLINE constexpr MyTuple(T&& t, Ts&&... ts)
		: value(std::move(t))
		, MyTuple<Ts...> (std::forward<Ts>(ts)...){}
	FORCEINLINE explicit MyTuple(const MyTuple<T,Ts...> &other) = default;
	FORCEINLINE MyTuple(MyTuple<T,Ts...> &&other)
		: MyTuple<Ts...>(std::forward<MyTuple<Ts...>>(other)),
		value(std::move(other.value)){}

	FORCEINLINE constexpr int size() const { return 1 + MyTuple<Ts...>::size(); }
	constexpr static int sz = 1 + MyTuple<Ts...>::sz;
	FORCEINLINE MyTuple<Ts...> &next(){return *static_cast<MyTuple<Ts...>*>(this);}
	using tnext = MyTuple<Ts...>;
	T value;
	FORCEINLINE ~MyTuple() {}
	constexpr static bool isitem = false;
};
struct MyTupleEmpty
{
	PLACEHOLDER
	FORCEINLINE constexpr int size() const { return 0; }
	static constexpr int sz = 0;
	~MyTupleEmpty() {}
	constexpr static bool isitem = false;
};

template <typename T> struct MyTuple<T> {
	FORCEINLINE MyTuple(T&& t) : value(std::move(t)){}
	FORCEINLINE explicit MyTuple(const MyTuple<T> &other) = default;
	FORCEINLINE MyTuple(MyTuple<T> &&other): value(std::move(other.value)){}

	FORCEINLINE MyTupleEmpty &next() const{
		static MyTupleEmpty empty;
		return empty;
	}
	FORCEINLINE constexpr int size() const { return 1; }
	constexpr static int sz = 1;
	using tnext =MyTupleEmpty;
	T value;
	FORCEINLINE ~MyTuple() {}
	constexpr static bool isitem = false;
};
template <class T>struct unwrap_refwrapper{using type = T;};
template <class T>struct unwrap_refwrapper<std::reference_wrapper<T>>{using type = T&;};
 template <class T> using unwrap_decay_t = typename unwrap_refwrapper<typename std::decay<T>::type>::type;
template<typename... Ts>
static FORCEINLINE MyTuple<unwrap_decay_t<Ts>...> MakeTuple(Ts&&... args)
{
	return MyTuple<unwrap_decay_t<Ts>...>(std::forward<Ts>(args)...);
}
struct i3{
    auto setProp(auto x, i3 t = *(i3*)0)
    {
        typename decltype(x(*this))::tp c;
        return c;
    }
    using tp = i3;
};


#define s(x,y) setProp([](auto c){struct xxx: decltype(c)::tp{decltype(y) x = y;using tp = xxx;    decltype([] (auto xx, xxx &t = *(xxx*)0)\
    {\
        typename decltype(xx(t))::tp c;\
        return c;\
    }) setProp;auto BeginChildren(){return *this;}} d;return d;})

#define c(...) BeginChildren(),MakeTuple(__VA_ARGS__)
#define i(...) i3()




void func2()
{
    auto tp = MakeTuple(
    i(Window)
        .s(width,10)
        .s(height,20)
        .c(
            i(Item),
            i(Item2)
                .s(property1,10.0f)

        )
    );
    printf("%d %d %f\n",tp.value.height,tp.value.width, tp.next().value.next().value.property1);
}

int main()
{
    func2();
}

qml-like структура в compile time
Стандартизаторы всё пытались запретить шаблоны в локальных классах, да не вышло - понаоставляли дыр в лямбдах и decltype.
Если добавить -fpermissive, то gcc сожрёт даже с constexpr

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

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

  • Годный высер.

    Только от крестобляства глаза болят. Это бы на Сишку портануть. Но боюсь тогда тупизация может потеряться.

    > decltype
    В Сишечке это typeof.
    Ответить
    • > тогда тупизация может потеряться
      .s(width,"asdasasd")
              .s(width,"bagor")
              .s(width,42)

      Правда и тут её тоже нету.
      Такое компилится и работает.
      Ответить
      • В идеале чтобы был static constexpr, чтобы лишние декларации выкидывались. И да, типизация такая, что только последний задекларированный тип имеет значение. Зато шаблон который будет читать эти переменные увидит их сразу в нужном типе
        Ответить
    • > Это бы на Сишку портануть
      тогда глаза будут болеть от макроёбства

      эскобар.жпг
      Ответить
      • Будто тут его нет.

        На скорую руку портанул key-val часть на Си:

        а) Убрал питушарские tp.value.height
        б) Window никак не использовалось. Теперь это тип.
        в) оптимизировал ненужные лямбды и бройлерплейт
        г) typeof обещают завезти в новом Стандарте ™
        д) теперь при дублях полей компилятор выдаст ошибку:
        <source>:16:11: error: duplicate member 'bagor'
        16 | F(bagor,"asdasd") \

        https://godbolt.org/z/3jnTW4691
        #include <stdio.h>
        #include <stdlib.h>
        
        #define MakeTuple(name,...) struct name { \
          __VA_ARGS__ \
        }
        
        
        int main()
        {
        #define WINDOW \
                F(width,100) \
                F(height,200) \
                F(bagor,"rusni") \
        
            #define F(name,val) typeof(val) name;
            MakeTuple(
                Window,
                WINDOW
            )
            #define F(name,val) .name = val,
            tp = {WINDOW} ;
        
            
            printf("%d %d bagor %s\n",tp.height,tp.width, tp.bagor);
        
            struct Window w = {WINDOW} ;
            w.height+=22;
            w.width *=0;
        
            printf("%d %d %s bagor\n",w.height,w.width, w.bagor);    
        }


        PS Минус не мой.
        Ответить
    • Идите с Путиным Пидором портаните друг друга.
      Ответить
          • Лучше расскажи про айпишники.

            Как только тебя уличили во вранье, ты сразу слился с той ветки.
            Ответить
            • Пошел нахуй с той ветки, нагодон
              Ответить
              • Тут наш уважаемый юзер из Осетии честно признался что конечно срал и спамил.
                Но не баззвордами из дискурса «рус-ня дрис-ня».
                Чем опроверг необоснованные нападки на другого юзера.

                https://govnokod.ru/28324#comment785171

                Впрочем лалка уже слилась:
                > Я не обязан в очередной раз что-то доказывать
                Ответить
                • а, так это вообще neverending story

                  это ж иньо крестовые походы собирает?
                  Ответить
                  • Честно говоря путаюсь в их разборках.

                    Потому вопрос не по адресу. Тут я совершенно некомпетентен.

                    Стоило мне раз посмеяться, он немедленно бомбанул и начал бегать за мной по всем тредам.
                    Ответить
    • >В Сишечке это typeof.

      в сишечке? не в гцц?
      Ответить
  • Наша служба и опасна и трудна,
    И на первый взгляд как-будто не видна.
    Если кто-то кое-где у нас порой
    Сишачку учить не хочет - то с такими нам вести неравный бой
    Так написано судьбой для нас с тобой, для нас с тобой.
    Ответить

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

Где здесь C++, guest?!

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


    8