Estoy tratando de poner en práctica mi propio flujo de depuración-salida QDebug() estilo, esto es básicamente lo que tengo hasta ahora:¿Cómo funciona QDebug() << cosas; agregar una nueva línea automáticamente?
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
};
uso típico:
debug() << "stuff" << "more stuff" << std::endl;
pero me gustaría no tener que agregar std :: endl;
Mi pregunta es, básicamente, ¿cómo puedo saber cuando el tipo de retorno del operador < < no va a ser utilizado por otro operador < < (y esto añadir endl)?
La única forma en que puedo pensar para lograr algo como esto sería crear una lista de cosas para imprimir con cada objeto temporal creado por debug(), luego imprimir todo, junto con la línea nueva final (y yo podría hacer cosas ingeniosas como insertar espacios) en ~ debug(), pero obviamente esto no es ideal ya que no tengo la garantía de que el objeto temporal vaya a ser destruido hasta el final del alcance (¿o no?).
'qDebug()' solo crea objetos temporales. Sigue el símbolo y encontrarás algo como esto: 'QDebug qDebug() {return QDebug (QtDebugMsg); } ' –