2015-03-30 16 views
6

Einige der Standardfunktionen iomanip übernehmen einen Parameter.Wie werden iomanip-Funktionen implementiert?

Ich würde gerne wissen, wie dies erreicht wird, zum Beispiel, kann ich etwas Ähnliches mit einer Funktion machen? Das ist wirklich die Lösung, die ich für this answer brauchte, aber ich konnte nicht herausfinden, wie das geht.

Wenn ich die Definition nachgeschlagen für setw Funktion zum Beispiel in http://en.cppreference.com listet es den Rückgabetyp als „nicht spezifiziert“, und es listet auch nur ein Argument, anstatt auch einen stream& Parameter genommen. Wie funktioniert das?

+1

Sie verwenden tatsächlich Hilfsfunktionen/Klassen und spezialisierten 'Operator <<()'/'Operator >>()' Überladungen für diese. –

+0

Im Gegensatz zu einer benutzerdefinierten Formatierungsoption verfügt der Stream über eine Mitgliederfunktion "width", die als Accessor und Mutator fungiert. Soweit ich weiß, müssen benutzerdefinierte Zusätze ziemlich oft 'xalloc' et. al. – chris

+0

@chris Was ist dieser 'xalloc' Wahnsinn, von dem du sprichst? Ich lese die http://www.cplusplus.coms [Beschreibung des 'xalloc'] (http://www.cplusplus.com/reference/ios/ios_base/xalloc/), aber das hat wirklich nichts für mich geklärt. –

Antwort

6

Hier ist ein einfaches Beispiel eines benutzerdefinierten Manipulator, der einen Parameter definiert mit einer Klasse nimmt:

#include <iostream> 

class putX // injects some `X`s into the stream 
{ 
    std::size_t _n; 
public: 
    explicit putX(std::size_t n): _n(n) {} 
    std::size_t getn() const {return _n;} 
    friend std::ostream& operator<<(std::ostream& os, const putX& obj) 
    { 
     std::size_t n = obj.getn(); 
     for (std::size_t i = 0; i < n; ++i) 
      os << 'X'; 
     return os; 
    } 
}; 

int main() 
{ 
    std::cout << putX(10) << " test " << putX(10); 
} 

Manipulatoren, die einfach implementiert werden kann, keine Parameter übernehmen als

std::ostream& custom_manip(std::ostream& os) { // do something with os and return os;} 

Das liegt daran, basic_ostream::operator<< hat eine Überlast, die einen Zeiger auf Funktion std::ostream& (*fp)(std::ostream&) als seine rechte Seite nimmt (z. B. ein Manipulator)

PS: Die C++ - Standardbibliothek von N. Josuttis beschreibt, wie Manipulatoren/Custom-Manipulatoren sehr detailliert arbeiten, siehe Kap. 15.6.3 Benutzerdefinierte Manipulatoren

+0

_ "nicht sicher, ob Sie nur eine Funktion verwenden können" _ Sie können. Es gibt eine Operatorüberladung für den bestimmten Funktionszeiger, der dann verwendet wird. Es ist für Fälle ohne Parameter. –

+1

@ πάνταῥεῖ Ich meinte Manipulatoren, die Parameter nehmen. In diesem Fall müssten Sie 'std :: ostream & std :: ostream :: operator '(std :: ostream & (* fp) (std :: ostream &, param1, param2 ...))' überladen, was ist nicht erlaubt. – vsoftco

+0

@RemyLebeau Ich denke es kann, zumindest glaube ich, dass es nicht gegen den Standard ist. Hier ist etwas, über das ich gestolpert bin: http://StackOverflow.com/a/12182338/3093378 – vsoftco

Verwandte Themen