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

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
#define TYPE_INIT_(_Number, _Line, _Type,...) struct ln_##_Line##_number_##_Number : public _Type\
{\
  ln_##_Line##_number_##_Number()\
    :_Type(__VA_ARGS__){}\
\
  ln_##_Line##_number_##_Number(const _Type& _val)\
    :_Type(_val){}\
\
  const _Type& operator=(const _Type& _val)\
  {\
    ((_Type)(*this)) = _val;\
    return (*this);\
  }\
}
#define TYPE_INIT(_Number, _Line, _Type,...)  TYPE_INIT_(_Number, _Line, _Type, __VA_ARGS__)
#define INIT(_Type, ...) TYPE_INIT(__COUNTER__, __LINE__, _Type, __VA_ARGS__)

// использование

struct ABC
{
  int A,B,C;
  
  ABC(int _A,int _B,int _C)
    :A(_A),
    B(_B),
    C(_C)
  {}
};


struct TestClass
{
  INIT( string, "Ololo" ) lv_String;
  INIT( ABC, 1, 2, 3 ) lv_ABC;
};

Оттуда.

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

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

  • Самое интресное, что даже если бы я не написал, откуда это, то по коду бы и так догадались. Гейминдустрия стагнирует.
    Ответить
  • string lv_String("Ololo") и ABC lv_ABC(1, 2, 3) уже не в моде? Или я что-то недопонимаю?

    P.S. А ну да, понял, автор не знал о автосгенеренных операторах и решил запилить их сам через макроёбство. Печально, что тут сказать.
    Ответить
      • А где здесь С++11? И зачем оно здесь. Те два оператора, ради которых затевался этот макрос создаются автоматом даже в с++98. А конструктор с несколькими аргументами и так работает.
        Ответить
          • bormand
            >> Автор хочет, чтобы работало без С++11
            > А где здесь С++11?
            Автору не нужна подсказка, как заставить работать без С++11, а это и есть подсказка, как сделать, чтобы работало без С++11.)
            Ответить
            • Что-то я так и не понял зачем эта хуйня сделана. Только ради того, чтобы вместо:
              std::string a("aaa"), b("aaa");
              можно было писать
              INIT( std::string, "aaa") a, b;
              ?
              Ответить
            • bormand
              > P.S. А ну да, понял, автор не знал о автосгенеренных операторах и решил запилить их сам через макроёбство. Печально, что тут сказать.
              Не, ты не понял (или я). Члены класса же вроде нельзя так инициализировать до С++11.
              То есть ABC lv_ABC(1, 2, 3); легально до С++11, а
              struct TestClass
              {
              ABC lv_ABC(1, 2, 3);
              уже нет (только после С++11 и включая).
              Ответить
              • Внутри структуры/класса да, это имеет какой-то смысл. Хотя на самом деле оно и в конструкторе этого класса не так уж ужасно смотрится.
                Ответить
  • > ((_Type)(*this)) = _val;
    А вот эта черная магия точно работает? Что-то мне кажется, что тут запиливают временный объект, в него загоняют новое значение, а члены класса при этом никак не меняются...
    Ответить
  • Бесполезная КрестоХрень.
    Автора жарить на сковородке до полного просветления.
    Ответить
    • Она еще и неюзабельна из-за неправильно реализованного оператора присваивания.
      Ответить
  • Я извиняюсь, что оффтоплю тут, но...
    Помню давно кто-то постил ссылку на статью на английском (поэтому и не представляю как нагуглить), где были собраны несколько "правил хорошего тона" в программировании. Помню, там упоминались египетские скобки, йода-стайл присваивания и т.п. Кто помнит, дайте ссылку, пожалуйста.
    Ответить

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

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

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


    8