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.
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? –
@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. –