namespace std {
template<class charT, class traits = char_traits<charT>, class Allocator = allocator<charT>>
class basic_osyncstream : public basic_ostream<charT, traits> {
public:
using char_type = charT;
using int_type = typename traits::int_type;
using pos_type = typename traits::pos_type;
using off_type = typename traits::off_type;
using traits_type = traits;
using allocator_type = Allocator;
using streambuf_type = basic_streambuf<charT, traits>;
using syncbuf_type = basic_syncbuf<charT, traits, Allocator>;
basic_osyncstream(streambuf_type*, const Allocator&);
explicit basic_osyncstream(streambuf_type* obuf)
: basic_osyncstream(obuf, Allocator()) {}
basic_osyncstream(basic_ostream<charT, traits>& os, const Allocator& allocator)
: basic_osyncstream(os.rdbuf(), allocator) {}
explicit basic_osyncstream(basic_ostream<charT, traits>& os)
: basic_osyncstream(os, Allocator()) {}
basic_osyncstream(basic_osyncstream&&) noexcept;
~basic_osyncstream();
basic_osyncstream& operator=(basic_osyncstream&&) noexcept;
void emit();
streambuf_type* get_wrapped() const noexcept;
syncbuf_type* rdbuf() const noexcept { return const_cast<syncbuf_type*>(addressof(sb)); }
private:
syncbuf_type sb;
};
}
Allocator shall meet the
Cpp17Allocator requirements
(Table
36)
. [
Example 1:
A named variable can be used within a block statement for streaming
. {
osyncstream bout(cout);
bout << "Hello, ";
bout << "World!";
bout << endl;
bout << "and more!\n";
}
—
end example]
[
Example 2:
A temporary object can be used for streaming within a single statement
. osyncstream(cout) << "Hello, " << "World!" << '\n';
In this example,
cout is not flushed
. —
end example]