2016-06-06 85 views
-1

Ich möchte eine Funktion haben, die wie Cout wirkt, aber mit einigen Optionen.Anpassen von Cout aus einer Klasse mit Optionen

ZB: MyFunc(0) << "Cats like to drink milk " << 2 << endl; wenn sein 0, sollte es nicht sein Ausgang

Wenn sein wie folgt aus:

MyFunc(1) << "Cats like to drink milk " << 2 << endl; 

ich die Ausgabe sehen sollte "Cats milk2 trinken". Ich lese aus mehreren Foren, dass Ostream benötigt wird, aber ich bin mir nicht sicher, wie ich es für meinen Zweck verwenden kann. MyFunc ist im Grunde eine Klasse mit 1, 0 Optionen für den Konstruktor.

Ich habe solche Dinge gesehen, aber ich verstehe nicht, wie es funktioniert.

Log& operator<< (std::ostream &(*f)(std::ostream &)){ 
cout << *f; 
return *this; 
} 

Jede geschätzt Hilfe.

+0

Haben Sie eines der einfacheren Teile dieses Problems gelöst? Wie eine Klasse zu schreiben, die sich wie "Cout" verhält, ohne die Nummer zu nennen? – Beta

+0

Nun, Sie sollten im Allgemeinen davor zurückschrecken, von Objekten im Standard-Namespace zu erben, aber ich könnte vorhersehen, dass Sie 'std :: cout' einpacken und den Operator' << 'für alle [gleichen Typen] implementieren (http: // en .cppreference.com/w/cpp/io/basic_ostream/operator_ltlt). Etwas wie [dies] (http://coliru.stacked-crooked.com/a/4970cbea5b144ec7) – AndyG

+0

@AndyG, geschätzt. Was ich genau gesucht habe! – user42826

Antwort

0

Es geht im Grunde wie folgt:

class CoutPlus { 
public: 
    CoutPlus(int& i) : m_bOn(i) {} 
    template<class T> CoutPlus& operator<<(const T& val) { 
     if (m_bOn) 
      std::cout << val; 
     return *this; 
    } 
private: 
    bool m_bOn; 
}; 

Sie entscheiden, was mit leeren Konstruktor und Zuordnung zu tun, und ob andere Ostream Mitgliedsfunktionen zu implementieren.