使用运算符的记录功能<<

时间:2015-10-19 15:07:03

标签: c++ operators

我想写一个记录功能,应该像这样使用:

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功能,增强和非标准库)。

1 个答案:

答案 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构造函数。然后你必须将它锁定在构造函数中并在析构函数中解锁它。它将保证不同条目的并发写入的同步。