向std :: cout添加“提示”消息的最佳方法

时间:2013-08-09 15:58:38

标签: c++

我正在搜索向std::cout(或std::cerr)打印到控制台/文件输出的所有消息添加自定义初始消息的最佳方式。

例如,如果我设置此自定义提示消息将是字符串" [Log]",那么经典

std::cerr << "This is a log message" << std::endl;

将以这种方式打印:

> [Log] This is a log message

显然,我可以使用

获得此行为
std::string PROMPT_MSG = "[Log]";
std::cerr << PROMPT_MSG << "This is a log message" << std::endl;

但我喜欢一种侵入性较小的方式。

提前致谢

4 个答案:

答案 0 :(得分:7)

你可以写自己的课程:

#include <iostream>
#include <string>

class MyLogger
{
    std::ostream & out;
    std::string const msg;
public:
    MyLogger(std::ostream & o, std::string s)
    : out(o)
    , msg(std::move(s))
    { }

    template <typename T>
    std::ostream & operator<<(T const & x)
    {
        return out << msg << x;
    }
};

MyLogger MyErr(std::cerr, "[LOG] ");

用法:

MyErr << "Hello" << std::endl;

答案 1 :(得分:5)

正如Joachim Pileborg建议您可以使用日志框架。你可以使用一个现有的,或者从你自己开始,只包含一个类:

class MyLogger{}
template <typename T>
MyLogger& operator << (MyLogger& logger, const T& logStuff)
{
   std::cerr << PROMPT_MSG << logStuff << std::endl;
   return logger;
}

然后定义MyLogger类的全局变量:

MyLogger mylogger;

然后当你想写一个日志记录时,写一下:

mylogger << "This is a log message";

重载运算符&lt;&lt; MyLogger类会做你想做的事;

答案 2 :(得分:2)

我在最近的一个项目中遇到了同样的问题。我用这个小班解决了它:

class DebugOut
{
public:
static const int COLUMN_WIDTH = 15;
DebugOut(const std::wstring &type)
{
    std::wcout << type;
    for(int i=type.length();i<COLUMN_WIDTH;i++)
        std::wcout << " ";
    std::wcout << ": ";
}

~DebugOut()
{
    std::wcout << std::endl;
}
template <typename T>
friend DebugOut& operator<<(DebugOut& out,T i)
{
    std::wcout << i;
    return out;
}
};

示例用法:DebugOut(L“Log”)&lt;&lt; “东西”;

答案 3 :(得分:0)

我想你可以定义一个函数log和一个函数error,然后在你想要打印日志或错误方法时调用它们。这样您就不必每次都添加PROMPT_MSG。