Есть такой код:
class LogStreamBase {
public:
LogStreamBase(const ostream& os) : out(os) {}
template<typename T>
const LogStreamBase& operator<< (const T& var) {
prepare();
print_prolog();
out << var;
print_epilog();
}
protected:
virtual void print_prolog() = 0;
virtual void print_epilog() = 0;
const ostream& out;
};
Как работает operator <<, будучи вызванным вот так:
LogStreamDerived log;
log << "One" << "Two" << "Three";
Будут ли print_prolog и print_epilog вызваны для каждой строки, или для всей последовательности единожды?
Адекватен ли такой вариант или лучше наследовать streambuf и прикручивать его к ostream?
UPD: Если это не очевидно, то цель — выводить диагностические сообщения с указанием времени, вызывающей функции, уровня логгирования идт, плюс отсечение по оному уровню.