反正有没有把以下内容写成C++宏?

ano*_*non 20 c++ logging thread-safety ostringstream

my_macro << 1 << "hello world" << blah->getValue() << std::endl;
Run Code Online (Sandbox Code Playgroud)

应该扩展到:

std::ostringstream oss;
oss << 1 << "hello world" << blah->getValue() << std::endl;
ThreadSafeLogging(oss.str());
Run Code Online (Sandbox Code Playgroud)

Nic*_*lás 73

#define my_macro my_stream()
class my_stream: public std::ostringstream  {
public:
    my_stream() {}
    ~my_stream() {
        ThreadSafeLogging(this->str());
    }
};
int main() {
    my_macro << 1 << "hello world" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

my_stream创建一个临时类型,它是一个子类ostringstream.对临时工作的所有操作都是如此ostringstream.

当语句结束时(即,在main()中的整个打印操作的分号之后),临时对象超出范围并被销毁.在my_stream析构函数调用ThreadSafeLogging为"收集"以前的数据.

经过测试(g ++).

感谢/感谢dingo指出如何简化整个事情,所以我不需要重载operator<<.太糟糕的upvotes无法分享.

  • 使用std :: ostringstream作为my_stream的基类不是更简单吗?那么析构函数似乎是唯一需要的方法. (12认同)
  • 这是我在生活中看到的最出色的c ++析构函数的使用(或滥用). (7认同)
  • 我会摆脱宏并直接使用my_stream(),但除此之外,这太棒了.+1 (3认同)
  • 查看换行问题的这个问题.http://stackoverflow.com/questions/1134388/stdendl-is-of-unknown-type-when-overloading-operator (2认同)