我想写一个记录功能,应该像这样使用:
proc ds2;
data DS2_SCHOOL ;
dcl double wordsSlash wordsBack worksTheSame;
dcl char(20)logic withSlash withBack secondSlash secondBack;
method init();
logic = 'DB2_SCHOOL';
withSlash = 'Delimited/With/Slash';
wordsSlash = countw(withSlash, '/');
secondSlash = scan(withSlash, 2, '/');
withBack = 'Delimited\\With\\Back';
wordsBack = countw(withBack, '\\');
secondBack = scan(withBack, 2, '\\');
worksTheSame = (wordsSlash eq wordsBack) and (secondSlash eq secondBack);
end;
enddata;
run;
quit;
这应打印以下行,添加endl并立即刷新:
main.cpp:我的消息包含整数:123和double:1.2
我(简化)尝试实现该功能:
log(__FILE__) << "My message containing integer: " << 123 << " and double: " << 1.2;
我的问题是因为操作员的L-R关联性&lt;&lt;输出是:
main.cpp:我的消息包含整数:
123
并加倍:
1.2
有什么方法可以实现这个功能,还是我的使用要求无法实现?
理想情况下,我想使用普通的C ++ 03(即没有C ++ 11功能,增强和非标准库)。
答案 0 :(得分:3)
L-R关联性与您的问题无关(如果您谈论换行符)。问题是因为你在每次写入后都使用endl。你不需要它(如果你这样做,那么你就不需要刷新,因为endl已经刷新输出了。)
解决问题的简单方法:
class Writer
{
public:
template<typename T>
Writer & operator<<(T t)
{
cout << t;
return (*this);
}
~Writer()
{
try {
cout << endl;
}
catch (...) {
// You have to make sure that no
// exception leaves destructor
}
}
};
值得注意的是,您的方法并不是真正可扩展的:在多线程环境中使用您的代码是不可能的。假设两个线程正在写入您的日志记录:
Thread 1: log(__FILE__) << "a" << "b" << "c";
Thread 2: log(__FILE__) << "a" << "b" << "c";
在这里,您可以轻松地收到消息&#34; aabbcc \ n \ n&#34;在您的日志文件中,这是非常不受欢迎的。
为了避免这种情况,您可以在log()函数中使用静态互斥对象,并将其传递给Writer构造函数。然后你必须将它锁定在构造函数中并在析构函数中解锁它。它将保证不同条目的并发写入的同步。