2010-11-18 21 views
0

Salutations!Inverser une partie d'un flux (entre des marqueurs) en utilisant des effecteurs ou des manipulateurs

Je voudrais faire petit programme ce qui renverse une partie d'un flux entre les marqueurs en utilisant effecteurs flux et/ou Manipulateurs Par exemple:

De ceci: Cout < < « quelque chose » < < revstream :: start < < "asdf" < < 3.14 < < revstream :: fin < < "quelque chose";

à ceci: something41.3fdsasomething

J'aimerais que cela fonctionne pas seulement sur la norme et je Cout aimerais les intégrer à plusieurs reprises.

Je suis nouveau en C++ et mes principaux problèmes sont: - Je ne peux pas créer un nouveau flux pour stocker ce qui est à l'intérieur des marqueurs - Comment inverser le flux temporaire?

J'ai essayé tant de choses et je coincé ici:

class revstream { 

public: 

    static ostream& start(ostream &os) { 
     //do the reversing 
    return ???; 
    }  

    static ostream& end(ostream &os) { 

    return reversedstream; 
    } 
}; 

Répondre

0

Vous pouvez le faire, mais il est laid comme les fesses:

class revstream: public std::ostream 
{ 
public: 
    static std::ostream &start(std::ostream &os) 
    { 
     return *(new revstream(os)); 
    } 

    static std::ostream &end(std::ostream &rev) 
    { 
     revstream *actual_rev= dynamic_cast<revstream *>(&rev); 

     // logic for reversing output goes here 

     std::ostream &result= actual_rev->os; 
     delete actual_rev; 

     return result; 
    } 

    revstream(std::ostream &in_os): std::ostream(&reversebuf), os(in_os) 
    { 
     return; 
    } 

    std::ostream &os; 
    std::stringbuf reversebuf; 
}; 

Votre manipulateur ostream doit renvoyer une référence à ostream, donc vous devez allouer au sein revstream::start.

+0

Merci! Ça a marché! :) – user512614

0

Ce n'est pas comment vous avez demandé d'aller à ce sujet, mais je voudrais aborder le problème d'une manière différente. Au lieu d'écrire une sorte d'extension aux flux, pourquoi ne pas simplement écrire une fonction qui inverse une chaîne?

#include <string> 
#include <iostream> 
using namespace std; 

string reverse(const string& str) 
{ 
    return string(str.rbegin(), str.rend()); 
} 

int main() 
{ 
    cout << reverse("asdf") << "\n"; 
}