I have written my own operator<<
implementation in my Logger
class:
class Logger
{
public:
enum Severity
{
INFORMATION = 0,
WARNING = 1,
ERROR = 2
};
Logger( std::ostream &os, Logger::Severity severity )
: outputStream( os ), loggerSeverity( severity ) {}
const std::vector<std::string>& getLogLines() const { return logLines; }
friend Logger& operator<<( Logger &logger, Logger::Severity severity ) {
logger.currentSeverity = severity;
return logger;
}
friend Logger& operator<<( Logger &logger, const char *logLine ) {
if( logger.currentSeverity >= logger.loggerSeverity )
{
logger.logLines.push_back( logLine );
logger.outputStream << logLine;
}
return logger;
}
private:
std::ostream &outputStream;
Logger::Severity loggerSeverity;
std::vector<std::string> logLines;
Logger::Severity currentSeverity;
const std::map<Logger::Severity, std::string> severityMap =
{
{ Logger::Severity::INFORMATION, "<INF>" },
{ Logger::Severity::WARNING, "<WARN>" },
{ Logger::Severity::ERROR, "<ERR>" }
};
};
now I am wondering how I can supoprt std::hex
formatting? I would like to be able to call my logger like this:
logger << Logger::Severity::ERROR << "CRC mismatch ( expected 0x" << std::hex << record->metaData.crc << " but got 0x" << std::hex << crc32 << std::dec << " )" << "n";
but I get:
error: no match for ‘operator<<’ (operand types are ‘Logger’ and ‘std::ios_base&(std::ios_base&)’)
79 | logger << Logger::Severity::ERROR << "CRC mismatch ( expected 0x" << std::hex << record->metaData.crc << " but got 0x" << std::hex << crc32 << std::dec << " )" << "n";
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^~ ~~~~~~~~
| | |
| Logger std::ios_base&(std::ios_base&)