2011-12-08 15 views
7

Estoy escribiendo un registrador. Si está deshabilitado, este es el código que define la macro LOG:Transmisión nula, ¿tengo que incluir ostream?

#ifdef NO_LOG 

#include <ostream> 

struct nullstream : std::ostream { 
    nullstream() : std::ios(0), std::ostream(0) {} 
}; 

static nullstream logstream; 

#define LOG if(0) logstream 

#endif 

LOG << "Log message " << 123 << std::endl; 

Funciona correctamente. El compilador debería eliminar por completo el código relacionado con la macro LOG.

Sin embargo, me gustaría evitar la inclusión de ostream y definir el objeto logstream como algo realmente "ligero", posiblemente nulo.

¡Gracias!

Respuesta

12
// We still need a forward declaration of 'ostream' in order to 
// swallow templated manipulators such as 'endl'. 
#include <iosfwd> 

struct nullstream {}; 

// Swallow all types 
template <typename T> 
nullstream & operator<<(nullstream & s, T const &) {return s;} 

// Swallow manipulator templates 
nullstream & operator<<(nullstream & s, std::ostream &(std::ostream&)) {return s;} 

static nullstream logstream; 

#define LOG if(0) logstream 

// Example (including "iostream" so we can test the behaviour with "endl"). 
#include <iostream> 

int main() 
{ 
    LOG << "Log message " << 123 << std::endl; 
} 
+0

Funciona, pero ¿es posible evitar la inclusión de iostream? Por ejemplo, ¿es posible usar algo más en lugar de std :: endl? –

+0

@Pietro: eso solo es necesario para el ejemplo, para 'std :: endl'. 'nullstream' en sí mismo no necesita eso, solo' '(declaraciones avanzadas de los tipos' '). –

+0

@Pietro A menudo es posible usar '\ n' en lugar de std :: endl. – UncleBens

5

Por qué no poner en práctica toda la cosa desde cero:

struct nullstream { }; 

template <typename T> 
nullstream & operator<<(nullstream & o, T const & x) { return o; } 

static nullstream logstream; 
+2

Eso debería ser '' nullstream' en lugar de std :: ostream'? – sth

+2

¿Quiere decir 'nullstream & operator << (nullstream & o, T const & x)'? Y no funcionará con 'endl'. – fefe

+0

@fefe: tienes razón; endl parece ser el único problema, ahora. ¿Es posible terminar una transmisión de otra manera? Realmente me gustaría evitar la inclusión de ostream si no necesito iniciar sesión ... –

Cuestiones relacionadas