Is there anyway to write the following as a C++ macro?

#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;
}

A temporary of type my_stream is created, which is a subclass of ostringstream. All operations to that temporary work as they would on an ostringstream.

When the statement ends (ie. right after the semicolon on the whole printing operation in main()), the temporary object goes out of scope and is destroyed. The my_stream destructor calls ThreadSafeLogging with the data “collected” previously.

Tested (g++).

Thanks/credits to dingo for pointing out how to simplify the whole thing, so I don’t need the overloaded operator<<. Too bad upvotes can’t be shared.

Leave a Comment