Я хотел бы создать класс для ведения журнала, который будет вести себя как std::cout
, но автоматически добавит дополнительную информацию в поток.перегрузка << оператор и параметры передачи для std :: cout
обычая образец, который я хочу, было бы что-то вроде (позволяет не заботиться об объекте и типе контекста на данный момент, только предположить, что они являются станд :: строка):
Logger l;
l << "Event with object : " << obj << " while in context : " << context;
Тогда результат будет:
[timestamp] Event with object : [obj_desc] while in context : [this context][eol][flush]
Я пытался с:
template<typename T>
Logger& operator << (const T& msg){
std::cout << timestamp() << msg << std::endl << std::flush;
return *this;
}
но мне кажется, что std::cout
не может разрешить typename T
и не выводит строку std :: например, во время segfault.
Возможным решением было бы перегрузить это для всех типов, но это довольно раздражает и требует много времени.
Есть ли лучший вариант для украшения std::cout
продукции с дополнительной информацией?
Edit:
Я понимаю теперь, что Endl и вровень будет добавляться к каждому сообщению, какого рода поражения цели, но я по-прежнему заинтересован в общей идее. Я больше забочусь о монадическом синтаксисе, чтобы добавить произвольное количество сообщений, чем перегрузка <<
.
'std :: endl' уже очищает поток. – chris
см.: [Обработка перегрузки std :: endl?] (Http://stackoverflow.com/q/2212776/14065) –
Пожалуйста, предоставьте полный (снятый, но полный) код для воспроизведения. Тогда не перефразируйте ошибку, но цитируйте это тоже. Скорее всего, вы используете это на временном или постоянном 'Logger' или пытаетесь передать в него перегруженную функцию, такую как' std :: endl', но без фактического кода и ошибки это невозможно. –