我正在搜索向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;
但我喜欢一种侵入性较小的方式。
提前致谢
答案 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。