- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
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;
}
};
P.S. А, оно у исходного объекта портит флаг enabled_, после чего у того ломается оператор <<... Извращенная семантика, однако.
Потому и здесь :) Непонятно, зачем было городить столько огорода. Ладно бы стейт на куче жил... Тогда бы вообще проще было использовать std::auto_ptr<Impl> и полагаться на костыли стандартной библиотеки вместо написания аналогичных собственноручно.
> перемещение без rvalue ссылок
> auto_ptr
Я понимаю, что не все люди хорошо ориентируется в 4 измерениях, поэтому тебе, наверное, не приходило в говову, что код мог быть написан гораздо раньше, чем опубликован.
Какое замечательное слово!
в говнову
А компилируется оно под старым стандартом?
Конечно, тут же ни одной фишки из с++11 не поюзали.
ЗЫЖ Недавно увидел интервью с вопросом "Надо ли программисту знать математику?". Это Вы там были?
В интервью был я, на хабре переодически выходят тематические нарезки с интервью.