Я пытаюсь реализовать свой собственный поток отладки-вывода в стиле qDebug()
, это в основном то, что я имею до сих пор:
struct debug
{
#if defined(DEBUG)
template<typename T>
std::ostream& operator<<(T const& a) const
{
std::cout << a;
return std::cout;
}
#else
template<typename T>
debug const& operator<<(T const&) const
{
return *this;
}
/* must handle manipulators (endl) separately:
* manipulators are functions that take a stream& as argument and return a
* stream&
*/
debug const& operator<<(std::ostream& (*manip)(std::ostream&)) const
{
// do nothing with the manipulator
return *this;
}
#endif
};
Типичное использование:
debug() << "stuff" << "more stuff" << std::endl;
Но я бы не хотел добавлять std::endl;
Мой вопрос в основном, как я могу сказать, когда тип возвращаемого значения operator<<
не будет использоваться другим operator<<
(и, следовательно, добавить endl
)?
Единственный способ, которым я могу придумать для достижения чего-либо подобного, - это создать список вещей для печати, связанных с каждым временным объектом, созданным qDebug()
, а затем распечатать все вместе с завершающим переводом строки (и я могу делать умные вещи как вставка пробелов) в ~debug()
, но, очевидно, это не идеально, так как у меня нет гарантии, что временный объект будет уничтожен до конца области (или я?).