我正在重构我的C ++应用程序。在我使用宏之前
LOG("something interesting") // 1
LOG("something ended") // 2
LOG("foo: " << bar) // 3
我现在的想法是写一个Log
类,如此:
Log(std::string _init_message):
init_message(_init_message)
{ PrintLogLine(init_message + " ...");}
~Log()
{ PrintLogLine(init_message + " done.");}
当我使用它时,获取特定动作的“自动”记录(即当它们开始时,停止+另外的时间等)
void ActionXYZ() {
Log log("xyz");
// do stuff
}
我正在努力的方法是确定一种方法,使其适用于案例3)。在Java中,我可以使用一个方法,它接受一个String
参数,因为编译器负责自动构建字符串。我在C ++中有什么可能性?
我可以让它工作,以便我可以像任何一个选项一样使用它吗?
// in "do stuff"
log("foo:" + bar); // OR
log << "foo:" << bar;
答案 0 :(得分:3)
正如我在评论中提到的,你可以使用Boost.Format。它也有助于解决字符串到字符串的转换等问题。但是,为了避免调用.str()
来调用std::string
构造函数,可能会有一些接受{boost::format
。 1}}直接。
Log log(boost::format("foo %1% bar") % 42); // with Log(boost::format)
Log log((boost::format("foo %1% bar") % 42).str()); // with only Log(std::string)
有关详细信息,请参阅Boost.Format documentation。
答案 1 :(得分:1)
想到两个直接的可能性。第一种是利用std :: string追加:
Log log(std::string("foo:") + bar);
第二个是制作更多带有其他参数的log
构造函数:
Log log("foo:", bar);
答案 2 :(得分:0)
您真的应该考虑使用Boost.Log进行日志记录。记录可能是一件复杂的事情;完成一个完整的实现是很有用的。
答案 3 :(得分:0)
您可以创建一个继承自std :: strstream的日志记录类。
class Mstream : public std::strstream
{
public:
Mstream() : std::strstream(Buffer = new char[BUFLEN], BUFLEN, ios::out);
ostream& endf(ostream& s);
void Write();
private:
char* Buffer;
};
现在您可以将输出记录为
Mstream m;
m <<"Foo"<<s<<endf;
在endf(ostream&amp; s)中,您可以将ostream强制转换为Mstream并调用Write()。在Write()中,格式化输出并将其打印到控制台或文件。