Bonjour à tous,
j'ai une classe qui surcharge l'opérateur << pour permettre la sortie formatée vers un ostream.
Je veux que l'utilisateur de ma classe puisse déclarer son propre ostream-like avec une sortie formatée à lui.
Tout marche comme je veux sauf pour le retour à la ligne avec endl.
Voici un petit bout de code (ultra simplifié) qui illustre mon cas:Quelqu'un saurait-il comment faire (proprement) ce genre de truc ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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