Я пытаюсь реализовать свой собственный поток отладки-вывода в стиле 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;
Мой вопрос в основном, как я могу узнать, когда возвращаемый тип оператора << не будет использоваться другим оператором << (и, таким образом, добавить endl)? </p>
Единственный способ, которым я могу придумать для достижения чего-либо подобного, - это создать список вещей для печати, связанных с каждым временным объектом, созданным debug (), затем распечатать все вместе с завершающим символом новой строки (и я мог делать умные вещи, такие как вставка пробелов) в ~ debug (), но, очевидно, это не идеально, так как у меня нет гарантии, что временный объект будет уничтожен до конца области (или нет?).