Yes and no. It works on any object for which the operator <<
has been defined with an ostream. That or any object for which ostringstream
has an overloaded method to handle.
Either the object in question that you pass into the function has the following defined:
ostream& operator <<(ostream &os, MyObj &obj);
or it falls into one the standard overloads. Here is a list of the overloaded functions found within `ostream' taken from here:
ostream& operator<< (bool& val );
ostream& operator<< (short& val );
ostream& operator<< (unsigned short& val );
ostream& operator<< (int& val );
ostream& operator<< (unsigned int& val );
ostream& operator<< (long& val );
ostream& operator<< (unsigned long& val );
ostream& operator<< (float& val );
ostream& operator<< (double& val );
ostream& operator<< (long double& val );
ostream& operator<< (const void* val );
ostream& operator<< (streambuf* sb );
ostream& operator<< (ostream& ( *pf )(ostream&));
ostream& operator<< (ios& ( *pf )(ios&));
ostream& operator<< (ios_base& ( *pf )(ios_base&));
* the following functions are not members but GLOBAL functions:
ostream& operator<< (ostream& out, char c );
ostream& operator<< (ostream& out, signed char c );
ostream& operator<< (ostream& out, unsigned char c );
ostream& operator<< (ostream& out, const char* s );
ostream& operator<< (ostream& out, const signed char* s );
ostream& operator<< (ostream& out, const unsigned char* s );