I'm trying to create a simple qDebug-like class I can use to output debug messages in debug mode, dependant on some debug level passed when calling the app. I liked the ease of use of the QDebug class (which could be used as a std::cerr and would disappear when compiling in release mode). I have this so far:
#ifdef DEBUG
static int CAKE_DebugLevel;
class Debug
{
Debug( int level ) : m_output( level <= CAKE_DebugLevel ) {}
template<typename T>
Debug& operator<<( T )
{
if( m_output )
{
std::cout << T;
return *this;
}
else
return *this;
}
private:
bool m_output;
};
#else // release mode compile
#define Debug nullstream
#endif // DEBUG
I think a nullstream
-kind of thing would be best for the release mode define:
class nullstream{};
template <typename T>
nullstream& operator<<(nullstream& ns, T)
{
return ns;
}
In main I have for the moment:
#include "Debug.h"
#include <iostream>
int main()
{
Debug(0) << "Running debug version of CAKE." << std::endl;
}
Which is giving the following error with gcc 4.5.1:
In member function 'Debug& CAKE_Debug::operator<<(T)': expected primary-expression before ';' token (points at the line
std::cout << T;
)In function 'int main(int, char**, char**)': expected unqualified-id before '<<' token
I'm sure it's something simple, but all the general template info I've found turns up nothing. Thanks for any help!
If you need more info, please ask.
See Question&Answers more detail:os