I'm trying to implement my own qDebug()
style debug-output stream, this is basically what I have so far:
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
};
Typical usage:
debug() << "stuff" << "more stuff" << std::endl;
But I'd like not to have to add std::endl;
My question is basically, how can I tell when the return type of operator<<
isn't going to be used by another operator<<
(and so append endl
)?
The only way I can think of to achieve anything like this would be to create a list of things to print with associated with each temporary object created by qDebug()
, then to print everything, along with trailing newline (and I could do clever things like inserting spaces) in ~debug()
, but obviously this is not ideal since I don't have a guarantee that the temporary object is going to be destroyed until the end of the scope (or do I?).
qDebug()
just creates temporary objects. Follow the symbol and you will find something like this:QDebug qDebug() { return QDebug(QtDebugMsg); }
. – Blackfellow