c++ - stream operators where lhs is not a std::iostream instance -
i have custom output class has 2 std::ostream members serve different purposes. either stream used depending upon how output class configured. in instances, 2 streams chained together. grossly simplified version of class below. can provide more details if needed.
class c_output { public: c_output (bool x_usea) : m_usea(x_usea) { /* setup m_stream[ab] here */ }; ~c_output (); inline std::ostream& stream () { return (m_usea ? m_streama : m_streamb); }; private: bool m_usea; std::ostream m_streama; std::ostream m_streamb; } i know how write stream operators classes wish stream to/from std::cout, std::cin, or other std::iostream, struggling write stream operators c_output instance serves lhs instead of std::ostream instance.
right now, able away with:
c_output l_output; uint64_t l_value = 0xc001c0de; l_output.stream() << std::hex << std::setw(16) << std::setfill('0') << l_value; c_output::stream() returns appropriate std::ostream&, behaves expected.
i rewrite above as:
c_output l_output; uint64_t l_value = 0xc001c0de; l_output << std::hex << std::setw(16) << std::setfill('0') << l_value; i have attempted several different versions of defining operator<< based on examples have seen here on stackoverflow , greater web no avail. latest version looks this:
// in header class c_output { ... friend c_output& operator<< (c_output& x_output, std::ostream& x_stream); ... } // in source c_output& operator<< (c_output& x_output, std::ostream& x_stream) { x_output.stream() << x_stream; return x_output; } the setup of arguments intended mirror standard stream operator overload. setup gives me compile issues such as:
error: no match 'operator<<' in 'l_output << std::hex' note: candidates are: c_output& operator<<(c_output&, std::ostream&) i have stripped away file , line information, gets point across. getting type rhs of operator incorrect. correct type and/or correct means of implementing stream operator desired?
there complementary c_input class has similar requirement, adapting answer c_output should trivial.
the type of std::hex std::ios_base& (*)(std::ios_base&). change operator signature to:
c_output& operator<< (c_output& x_output, std::ios_base& (*x_stream)(std::ios_base&));
Comments
Post a Comment