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:
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.
    }
Quelqu'un saurait-il comment faire (proprement) ce genre de truc ?