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

    +42

    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
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    class Message {
    public:
        explicit Message(Level level);
        ~Message();
    
        Level level() const { return level_; }
        const time_t& time() const { return time_; }
        std::string text() const { return s_.str(); }
        bool enabled() const { return enabled_; }
    
        template<class T>
        Message& operator << (const T& t)
        {
            if (enabled_)
                s_ << t;
            return *this;
        }                                                                                       
    
        Message(Message& msg) { moveFrom(msg); }
        Message& operator = (Message& msg) { moveFrom(msg); return *this; }
        struct Ref {
            explicit Ref(Message& msg): msg_(&msg) {}
            Message* msg_;
        };                                                                                                                                
        operator Ref() { return Ref(*this); }
        Message(Ref r) { moveFrom(*r.msg_); }
        Message& operator = (Ref r) { moveFrom(*r.msg_); return *this; }
    
    private:
        Level level_;
        time_t time_;
        std::ostringstream s_;
        bool enabled_;
    
        void moveFrom(Message& msg)
        {
            level_ = msg.level_;
            time_ = msg.time_;
            s_.str(msg.s_.str());
            enabled_ = msg.enabled_;
            msg.enabled_ = false;
        }
    };

    move головного мозга

    Запостил: roman-kashitsyn, 30 Октября 2014

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

    • А ведь врут! moveFrom не перемещает, а тупо копирует ;)

      P.S. А, оно у исходного объекта портит флаг enabled_, после чего у того ломается оператор <<... Извращенная семантика, однако.
      Ответить
      • > moveFrom не перемещает, а тупо копирует ;)

        Потому и здесь :) Непонятно, зачем было городить столько огорода. Ладно бы стейт на куче жил... Тогда бы вообще проще было использовать std::auto_ptr<Impl> и полагаться на костыли стандартной библиотеки вместо написания аналогичных собственноручно.
        Ответить
        • Хех. Если бы не этот enabled - получился бы нормальный объект с value семантикой. А так - какая-то собака на сене: и копирование испортилось, и перфоманса ни капли не добавилось.
          Ответить
        • > 2014
          > перемещение без rvalue ссылок
          > auto_ptr
          Ответить
          • > 2014
            Я понимаю, что не все люди хорошо ориентируется в 4 измерениях, поэтому тебе, наверное, не приходило в говову, что код мог быть написан гораздо раньше, чем опубликован.
            Ответить
    • Крестобляди решают траблы, которые им создает любимый язычок. Высрать кучу бесполезного ачитабельного поноса ради бздеха в лужу.
      А компилируется оно под старым стандартом?
      Ответить
      • > А компилируется оно под старым стандартом?
        Конечно, тут же ни одной фишки из с++11 не поюзали.
        Ответить
        • новый мем: "где тут ++11??"
          Ответить
        • Более того, тут специально не вкрутили новый стандарт, чтобы старый код компилялся. Но мозг уже повреждён недопонятой мув-семантикой.
          Ответить
    • Из Яндекса вестимо?
      ЗЫЖ Недавно увидел интервью с вопросом "Надо ли программисту знать математику?". Это Вы там были?
      Ответить
      • Происхождение кода уточнять не хотелось бы. Могу лишь сказать, что код в Я. очень качественный (отчасти благодаря отсеву кандидатов, отчасти благодаря постоянным код-ревью), но иногда попадаются забавные моменты.

        В интервью был я, на хабре переодически выходят тематические нарезки с интервью.
        Ответить

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