customize cout

前端 未结 6 972
你的背包
你的背包 2021-02-06 00:22

How can I derive a class from cout so that, for example, writing to it

new_cout << \"message\";

would be equivalent to

6条回答
  •  灰色年华
    2021-02-06 00:53

    Further from Mykola's response, I have the following implementation in my code. The usage is

             LOG_DEBUG("print 3 " << 3); 
    

    prints

             DEBUG (f.cpp, 101): print 3 3 
    

    You can modify it to use FUNCTION along/in place of LINE and FILE

    /// Implements a simple logging facility. 
    class Logger
    {
            std::ostringstream os_;
            static Logger* instance_;
            Logger();
    public:
            static Logger* getLogger();
            bool isDebugEnabled() const;
            void log(LogLevelEnum l, std::ostringstream& os, const char* filename, int lineno) const;
            std::ostringstream& getStream()
            { return os_; }
    };
    
    void Logger::log(LogLevelEnum l, std::ostringstream& os, const char* filename, int lineno) const
    {
            std::cout << logLevelEnumToString(l) << "\t(" << fileName << ": " << lineno << ")\t- " << os.str();
            os.str("");
    }
    
    #define LOG_common(level, cptext) do {\
            utility::Logger::getLogger()->getStream() << cptext; \
            utility::Logger::getLogger()->log(utility::level, utility::Logger::getLogger()->getStream(), __FILE__, __LINE__);  \
    } while(0); 
    
    enum LogLevelEnum {
            DEBUG_LOG_LEVEL,
            INFO_LOG_LEVEL,
            WARN_LOG_LEVEL,
            ERROR_LOG_LEVEL,
            NOTICE_LOG_LEVEL,
            FATAL_LOG_LEVEL
    };
    
    #define LOG_DEBUG(cptext)    LOG_common(DEBUG_LOG_LEVEL, cptext)
    #define LOG_INFO(cptext)     LOG_common(INFO_LOG_LEVEL , cptext)
    #define LOG_WARN(cptext)     LOG_common(WARN_LOG_LEVEL , cptext)
    #define LOG_ERROR(cptext)    LOG_common(ERROR_LOG_LEVEL, cptext)
    #define LOG_NOTICE(cptext)   LOG_common(NOTICE_LOG_LEVEL, cptext)
    #define LOG_FATAL(cptext)    LOG_common(FATAL_LOG_LEVEL, cptext)
    
    const char* logLevelEnumToString(LogLevelEnum m)
    {
            switch(m)
            {
                    case DEBUG_LOG_LEVEL:
                            return "DEBUG";
                    case INFO_LOG_LEVEL:
                            return "INFO";
                    case WARN_LOG_LEVEL:
                            return "WARN";
                    case NOTICE_LOG_LEVEL:
                            return "NOTICE";
                    case ERROR_LOG_LEVEL:
                            return "ERROR";
                    case FATAL_LOG_LEVEL:
                            return "FATAL";
                    default:
                            CP_MSG_ASSERT(false, CP_TEXT("invalid value of LogLevelEnum"));
                            return 0;
            }
    }
    

提交回复
热议问题