2009-05-05 4 views
6

Ho una classe C++ MyObject e voglio essere in grado di alimentare questi dati come farei con un osstream (ma a differenza di un flusso diretto, i dati in arrivo devono essere formattati a modo speciale). Non riesco a capire come sovraccaricare un operatore per MyObject per mangiare input dati ad esso.Una classe C++ si comporta come un ostream personalizzato, sstream

class MyObject { 
public: 
    ostringstream s; 
    FEEDME 
}; 


int main() { 
    MyObject obj; 
    obj.FEEDME << "Hello" << 12345; 

    // I want obj.s == ":Hello::12345:" 

} 

lo voglio così ogni elemento alimentato a essere circondato da::

Quindi, nell'esempio dato, s = ": Ciao :: 12345" dovrebbe essere il risultato finale. Qual è la mia domanda, come posso dire all'oggetto che, quando mai un <<something, metti:: intorno a qualcosa.

È possibile?

risposta

9

provare questo:

class MyObject { 
public: 
    template <class T> 
    MyObject &operator<<(const T &x) { 
     s << ':' << x << ':'; 
     return *this; 
    } 

    std::string to_string() const { return s.str(); } 

private: 
    std::ostringstream s; 
}; 

MyObject obj; 
obj << "Hello" << 12345; 
std::cout << obj.to_string() << std::endl; 

Ci sono alcune cose che non sarà in grado di spingere nel flusso, ma dovrebbe funzionare per tutte le basi.

+0

Grazie, credo di avere basi su come attuare subito, ancora ottenere un errore di "errore: Utilizzo non valido di utente (? Hai dimenticato il '&')" per MyObject & operator < <(const T & x) { Ma si scherza e si risolve. Grazie, signore. –

+0

Penso che compili bene in g ++ 4.3.3, cosa sta usando il compilatore? –

+0

g ++ (GCC) 4.3.2, sei corretto compila e funziona esattamente come lo voglio io! Grazie. Il problema sembra essere qualcosa di particolare per il mio programma. –

1

Vorrei adottare un approccio leggermente diverso e creare un oggetto formatore.
L'oggetto formater gestirà quindi l'inserimento del carattere di formato quando viene applicato a un flusso.

#include <iostream> 

template<typename T> 
class Format 
{ 
    public: 
     Format(T const& d):m_data(d) {} 
    private: 
     template<typename Y> 
     friend std::ostream& operator<<(std::ostream& str,Format<Y> const& data); 
     T const& m_data; 
}; 
template<typename T> 
Format<T> make_Format(T const& data) {return Format<T>(data);} 

template<typename T> 
std::ostream& operator<<(std::ostream& str,Format<T> const& data) 
{ 
    str << ":" << data.m_data << ":"; 
} 




int main() 
{ 
    std::cout << make_Format("Hello") << make_Format(123); 
}