2011-01-11 2 views
2

Quelqu'un pourrait-il m'expliquer la déclaration du manipulateur setw? J'ai été complètement époustouflé en essayant de le comprendre.! La déclaration de l'iomanip setw est comme suitPourquoi cout renvoie-t-il smanip?

smanip setw(int) 

maintenant ce qui est smanip? ce qui se passe quand on donne std :: Cout < < setw (10) < < « Hai » [je veux savoir comment la sortie est effectivement affectée par setw, autrement dit les actions qui se passe sous le capot)

Répondre

4

smanip est un type défini par l'implémentation. La bibliothèque peut définir ou typedef à tout ce qu'il aime, tant que le travail est fait.

En pratique, ce sera une sorte de structure représentant (a) la manipulation à effectuer, et (b) l'argument 10 à utiliser dans cette manipulation. Il peut également avoir une fonction pour effectuer la manipulation, ou il peut ne pas, selon comment l'implémentation a défini operator<<(ostream &, smanip), ou une surcharge similaire pour attraper les types d'opérande nécessaires. Je n'ai pas vérifié ma mise en œuvre pour le savoir. En ce qui concerne la manière dont la sortie est affectée: my_stream << setw(10) est défini pour avoir le même effet sur le flux que l'appel my_stream.width(10). Donc, la surcharge operator<< fera en sorte que cela se produise de façon spécifique à l'implémentation. La surcharge de l'opérateur pour les manipulateurs de flux non paramétrés est définie spécifiquement pour appeler le manipulateur, mais avec smanip, il y a un peu plus de liberté pour les implémentations.

+0

void Fonction1 {std :: cout.width (10); std :: cout.fill ('*'); } int main() {Fonction1(); std :: cout << "hai"; return 0;} De l'extrait ci-dessus je peux observer que les manipulateurs ont la portée de fonction! Est-ce aussi spécifique à la mise en œuvre? –

+0

@Karthik: l'effet d'un manipulateur n'a pas de portée lexicale. Lorsqu'il est déplacé sur l'objet de flux, il modifie l'objet de flux, puis les paramètres persistent dans l'objet de flux jusqu'à ce qu'ils soient réinitialisés. Votre code devrait sortir '******* hai', je ne pense pas que ce soit spécifique à l'implémentation. –

0

setw(int) par lui-même ne modifie rien. Il retourne simplement un manipulateur de flux (smanip) qui peut être utilisé pour modifier le comportement du flux.

// setw example 
#include <iostream> 
#include <iomanip> 
using namespace std; 

int main() { 
    cout << setw (10); 
    cout << 77 << endl; 
    return 0; 
} 
+0

Oui, mais savez-vous comment cela affecte? en d'autres termes, smanip semble être une classe modélisée, mais la décalcomanie est smanip setw (int). Ne devrait-il pas être smanip setw (int) ou quelque chose comme ça? –