2015-03-30 11 views
6

Alcune delle funzioni standard iomanip accettano un parametro.Come vengono implementate le funzioni iomanip?

Mi piacerebbe sapere come si realizza, ad esempio, posso fare qualcosa di simile con una funzione? Questa è davvero la soluzione di cui avevo bisogno per this answer, ma non riuscivo a capire come farlo.

Quando ho guardato la definizione per setw funzione per esempio in http://en.cppreference.com elenca il tipo restituito come "non specificato", ed è anche elenca solo argomento, piuttosto che prendere anche un parametro stream&. Come funziona?

+1

In realtà stanno utilizzando le funzioni/classi di supporto e gli operatori specializzati dell'operatore <<() '/' operatore >>() per questi. –

+0

A differenza di un'opzione di formattazione personalizzata, lo stream ha una funzione membro 'width' che funge da accessore e mutatore. Per quanto ne so, le aggiunte personalizzate devono praticamente usare 'xalloc' et. al. – chris

+0

@chris Cos'è questa follia 'xalloc' di cui parli? Ho letto http: //www.cplusplus.com's [descrizione di 'xalloc'] (http://www.cplusplus.com/reference/ios/ios_base/xalloc/) ma in realtà non ha chiarito nulla per me. –

risposta

6

Ecco un semplice esempio di un manipolatore definita dall'utente che accetta un parametro definito utilizzando una classe:

#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); 
} 

Manipolatore che non prendono parametri possono semplicemente essere implementati come

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

Questo perché basic_ostream::operator<< ha un sovraccarico che utilizza un puntatore a funzione std::ostream& (*fp)(std::ostream&) come il suo lato destro (es. Un manipolatore)

PS: La libreria standard C++ di N. Josuttis descrive come i manipolatori/manipolatori personalizzati funzionano in modo molto dettagliato, vedere il par. 15.6.3 Manipolatori definiti dall'utente

+0

_ "Non sono sicuro se puoi usare solo una funzione" _ Puoi. C'è un sovraccarico dell'operatore per il particolare puntatore di funzione usato allora. È per i casi senza parametri. –

+1

@ πάνταῥεῖ Intendevo i manipolatori che prendono i parametri. In tal caso, dovresti sovraccaricare 'std :: ostream & std :: ostream :: operator << (std :: ostream & (* fp) (std :: ostream &, param1, param2 ...))', che non è permesso. – vsoftco

+0

@RemyLebeau Penso che possa, almeno credo che non sia contro lo standard. Ecco qualcosa su cui sono incappato: http://stackoverflow.com/a/12182338/3093378 – vsoftco

Problemi correlati