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

    +16

    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
    #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, 20 Апреля 2013

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

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

      P.S. А ну да, понял, автор не знал о автосгенеренных операторах и решил запилить их сам через макроёбство. Печально, что тут сказать.
      Ответить
      • Автор хочет, чтобы работало без С++11
        Ответить
        • А где здесь С++11? И зачем оно здесь. Те два оператора, ради которых затевался этот макрос создаются автоматом даже в с++98. А конструктор с несколькими аргументами и так работает.
          Ответить
          • Тут пояснят по хардкору:
            http://www.gamedev.ru/code/tip/?id=6455
            Ответить
            • 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;
      А вот эта черная магия точно работает? Что-то мне кажется, что тут запиливают временный объект, в него загоняют новое значение, а члены класса при этом никак не меняются...
      Ответить
      • Ну да, так оно и есть: https://ideone.com/2QpkJ6.
        Оператор присваивания неработоспособен.
        Ответить
    • Бесполезная КрестоХрень.
      Автора жарить на сковородке до полного просветления.
      Ответить
      • Она еще и неюзабельна из-за неправильно реализованного оператора присваивания.
        Ответить
    • http://clang.llvm.org/cxx_status.html
      Кланг поддерживает все С++11 фичи. И начал запиливать ещё непринятый С++14 о_О
      Ответить
      • в gcc вообще есть ветка с концептами
        http://www.generic-programming.org/software/ConceptGCC/
        И только один M$ тормозит
        Ответить
    • Я извиняюсь, что оффтоплю тут, но...
      Помню давно кто-то постил ссылку на статью на английском (поэтому и не представляю как нагуглить), где были собраны несколько "правил хорошего тона" в программировании. Помню, там упоминались египетские скобки, йода-стайл присваивания и т.п. Кто помнит, дайте ссылку, пожалуйста.
      Ответить

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