2010-04-22 5 views
2

J'ai une classe qui est dérivée de ostream:Création Manipulateurs ostream pour une classe spécifique

class my_ostream: public std::ostream 
{ 
    // ... 
} 

Je veux faire un manipulateur (par exemple do_something), qui travaille spécifiquement à cette classe, comme ceci:

my_ostream s; 
s << "some text" << do_something << "some more text"; 

j'ai fait ce qui suit:

std::ostream &do_something(std::ostream &os) 
{ 
    my_ostream *s = dynamic_cast<my_ostream*>(&os); 
    if (s != NULL) 
    { 
     // do something 
    } 
    return os; 
} 

Cela fonctionne, mais est plutôt laid. J'ai essayé ce qui suit:

my_ostream &do_something(my_ostream &s) 
{ 
    // do something 
    return s; 
} 

Cela ne fonctionne pas. J'ai également essayé une autre approche:

class my_ostream: public std::ostream 
{ 
    // ... 
    my_ostream &operator<<(const do_something & x) 
    { 
     // do something 
     return *this; 
    } 
} 

Cela ne fonctionne toujours pas.

Répondre

3

Vous devez ajouter le support pour les manipulateurs dans votre classe:

#include<iostream> 
class my_ostream : public std::ostream 
{ 
    public: 
    std::string prefix; 

    my_ostream():prefix("*"){} 

    // manipulator support here: 
    my_ostream& operator<<(my_ostream&(*f)(my_ostream&)){ 
     f(*this); 
     return *this; 
    } 
}; 

my_ostream& operator<<(my_ostream &st, const std::string &s){ 
     std::cout << st.prefix << s; 
     return st; 
} 

// manipulator: clear prefix 
my_ostream& noprefix(my_ostream &st){ 
    st.prefix=""; 
} 

int main(){ 
    my_ostream s; 
    std::string str1("text"); 
    std::string str2("text"); 
    s << str1 << noprefix << str2; 
} 
+0

Je l'ai essayé, et ça ne marche pas. Il compile, mais la fonction de manipulation n'est pas appelée. Je trouve cela vraiment étrange, parce que c'est exactement comme cela est fait dans 'std :: ostream'. – petersohn

+0

@petersohn: cela doit être un problème avec votre compilateur, car le code ci-dessus fonctionne pour moi tel qu'il est (g ++ 3.4.4) – catwalk

+0

Je voulais juste ajouter que j'ai regardé toute la journée pour cette réponse et ce juste fonctionne comme prévu (g ++ 4.7.0). – cubuspl42

Questions connexes