1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| struct Point // ma classe
{
int x,y ;
// avec sa surcharge de l'opérateur de sortie formatée
template <typename output>
friend output & operator<< ( output & o , const Point & t ) ;
} ;
// implémentation de l'opérateur de sortie formatée
template <typename output> output & operator<< ( output & o , const Point & t )
{
o << "(" << t.x << "," << t.y << ")" ;
// o << output::endl ; // ne compile pas avec o == std::cout car endl n'est pas membre de std::ostream
return o ;
}
// le ostream-like de l'utilisateur
struct my_ostream
{
my_ostream & operator<< ( int x ) { printf("int : %d\n",x ) ; return *this ;}
my_ostream & operator<< ( const char * s ) { printf("string : \"%s\"\n",s ) ; return *this ;}
my_ostream & operator<< ( my_ostream&(*f)(my_ostream&)) { return f( *this ) ;}
// le "endl" de my_ostream a la même signature que celui de std :
static my_ostream & endl ( my_ostream & o ) { printf("end of line\n") ; return o ;}
} ;
void test_output2 ()
{
Point p = { 12,13 } ;
my_ostream my_cout ;
my_cout << p ;
std::cout << p ; // si je commente cet appel, le "o << output::endl" du dessus compile bien.
} |
Partager