我想要一个 C++ 类 Xyz
这样:
Xyz mything("/tmp/x1");
int main(int argc, char **argv) {
mything << "Hello world";
}
导致创建文件“/tmp/x1”,以及以下内容
2013-12-04 12:01 :: Hello world
写入它。
我遇到的第一个问题是 ostream
对于可能遵循 <<
的每种类型都有许多专门的方法.第二个是如果我有
cout << "hello" << "world";
和
cout << "hello";
然后是 operator <<
的实现要求"hello"
需要知道语句中是否有任何内容(我如何有效地执行 if(last_in_line_of_<<)
类型构造?)。
标准cout
通过拥有类似 endl
的对象来做到这一点.
基本上我想用一行创建一个全局日志对象,一旦定义了类,并用 ostream
写入它操作这样的字符串,比方说,cout
将被包裹在一个更大的字符串中。
自 varargs
以来,我一直在研究这种方法方法是痛苦的,许多人似乎反对它。
在像 Python 和 Ruby 这样的脚本语言中,对象有一个 str
或 to_s
方法(或等效方法)和 print
和 format
调用它们来格式化它们,这样 "hello {} world".format(x)
格式化一个参数,"hello {} world".format(" ".join(x))
加入一个列表,在格式化为字符串后,使用空格,然后将其粘贴到结果字符串中。
我想知道执行此操作的正确 C++ 方法是什么。
最佳答案
代替给 Xyz
一个流行为,让它成为一个操纵器并使用普通的流工具:
函数原型(prototype)为
std::ostream& logtime(std::ostream& s)
{
/* write date and time to s */
return s;
}
可以用作
std::cout << logtime << "text and other things" << std::endl;
如果 std::cout 被任何其他 ostream 替换(比如 std::filestream
类型的 outfile
变量),你会得到这种效果,但使用可以处理任何类型的输出流(不一定是文件)的操纵器
std::ofstream outfile("file");
outfile << logtime << "text and whatever else" << std::endl;
关于C++ ostream格式化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20411134/