I tried to overload the operator<< for implicit printing of wchar_t
string on a char stream.
Normally using it on a ostream will succeed as
std::operator<<<std::char_traits<char>
>(std::basic_ostream<char,std::char_traits<char & _Ostr={...}, ___)will be called.
However, I am using the boost::format library that internally makes use
of a string stream to store the formatted string. There:
std::basic_ostream<char,std::char_traits<char::ope rator<<(___)
will always be called.
On what basis will the compiler choose which kind of operator<< will be
called??
(see test code below)
thanks.
br,
Martin
test code:
###############
#include <iostream>
#include <fstream>
#include <sstream>
using namespace std;
// Output wchar_t* strings on char streams instead of formatting as
void* ...
ostream& operator<<(ostream& os, const wchar_t* c_ptr) {
return os << "(TYPE:wchar_t*)"; // placeholder
}
// Boost.Format library
#include <boost/format.hpp>
////////////////////////////////////////
int main(int argc, char* argv[])
{
ostringstream ostr;
ostream& o = ostr;
o << "\nTest of ostream << operator ..." << endl;
wchar_t* wstr = L"Hello world!";
o << "Output of wchar_t* -- " << wstr << endl;
// CALL STACK ...
// (2) opov.exe!std::operator<<<std::char_traits<char>
>(std::basic_ostream<char,std::char_traits<char & _Ostr={...}, constchar * _Val=0x0042f860) Line 747 C++
// (1)
opov.exe!operator<<(std::basic_ostream<char,std::c har_traits<char &
os={...}, const wchar_t * c_ptr=0x0042f8f0) Line 6 + 0xe bytes C++
// (0) opov.exe!main(int argc=1, char * * argv=0x00356828) Line 17 +
0x26 bytes C++
o << "\nTest of boost-library ostream << operator ..." << endl;
o << "Boost formatted wchar_t* -- " << boost::str(boost::format("%1%")
% wstr) << endl;
// CALL STACK ...
// (6) msvcp80d.dll!std::basic_ostream<char,std::char_tra its<char>
>::operator<<(const void * _Val=0x00433a54) Line 456 C++// (5)
opov.exe!boost::io::detail::put_last<char,std::cha r_traits<char>,wchar_t
*>(std::basic_ostream<char,std::char_traits<char & os={...}, wchar_t
* const & x=0x00433a54) Line 98 + 0x11 bytes C++
// (4)
opov.exe!boost::io::detail::put<char,std::char_tra its<char>,std::allocator<char>,wchar_t
* const &>(wchar_t * const & x=0x00433a54, const
boost::io::detail::format_item<char,std::char_trai ts<char>,std::allocator<char>
& specs={...},std::basic_string<char,std::char_traits<char>,std: :allocator<char &
res="",
boost::io::basic_altstringbuf<char,std::char_trait s<char>,std::allocator<char>
& buf={...}, std::locale * loc_p=0x00000000) Line 150 + 0x2c bytes C++// (3)
opov.exe!boost::io::detail::distribute<char,std::c har_traits<char>,std::allocator<char>,wchar_t
* const
&>(boost::basic_format<char,std::char_traits<char> ,std::allocator<char>
& self={...}, wchar_t * const & x=0x00433a54) Line 242 + 0x3f bytes C++// (2)
opov.exe!boost::io::detail::feed<char,std::char_tr aits<char>,std::allocator<char>,wchar_t
* const
&>(boost::basic_format<char,std::char_traits<char> ,std::allocator<char>
& self={...}, wchar_t * const & x=0x00433a54) Line 251 + 0xd bytes C++// (1)
opov.exe!boost::basic_format<char,std::char_traits <char>,std::allocator<char>
>::operator%<wchar_t *>(wchar_t * const & x=0x00433a54) Line 64 +0xd bytes C++
// (0) opov.exe!main(int argc=1, char * * argv=0x00356828) Line 53 C++
// As can be seen on (5) the parameter (now called x) is of type wchar_t*
// However, the basic_ostream operator<<(void*) will be called.
cout << ostr.str();
}
##################