Защо cout връща smanip?

Може ли някой да ми обясни декларацията на манипулатора setw? Бях напълно издухан, опитвайки се да го разбера! Декларацията на setw в iomanip е както следва

 smanip setw(int)

сега какво е smanip? какво се случва, когато дадем std::cout ‹‹ setw(10) ‹‹ "Hai" [ искам да знам как изходът всъщност се влияе от setw, с други думи действията, случващи се под капака)


person Karthick    schedule 11.01.2011    source източник


Отговори (2)


smanip е тип, дефиниран от внедряването. Библиотеката може да го дефинира или да го дефинира към всичко, което иска, стига работата да бъде свършена.

На практика това ще бъде някакъв вид структура, представляваща (а) манипулацията, която трябва да се извърши, и (б) аргумента 10, който да се използва в тази манипулация. Може също така да има функция за извършване на манипулацията или може да няма, в зависимост от това как имплементацията е дефинирала operator<<(ostream &, smanip) или някакво подобно претоварване за улавяне на необходимите типове операнди. Не съм проверил внедряването си, за да разбера.

Що се отнася до това как се влияе на изхода: my_stream << setw(10) е дефинирано да има същия ефект върху потока като извикването на my_stream.width(10). Така че претоварването operator<< ще гарантира, че това се случва по някакъв начин, специфичен за изпълнението. Претоварването на оператора за манипулатори на непараметризирани потоци е дефинирано специално за извикване на манипулатора, но с smanip има малко повече свобода за реализации.

person Steve Jessop    schedule 11.01.2011
comment
void Функция1 { std::cout.width(10); std::cout.fill('*'); } int main() { Функция1(); std::cout‹‹hai; return 0;} От горния фрагмент мога да забележа, че манипулаторите имат функционален обхват! Това също ли е специфично за изпълнението? - person Karthick; 11.01.2011
comment
@Karthik: ефектът на манипулатора няма лексикален обхват. Когато се премести върху обекта на потока, той променя обекта на потока, след което настройките остават в обекта на потока, докато не бъдат нулирани. Вашият код трябва да изведе *******hai, не мисля, че това е специфично за изпълнението. - person Steve Jessop; 11.01.2011

setw(int) сам по себе си не променя нищо. Той просто връща манипулатор на потока (smanip), който може да се използва за промяна на поведението на потока.

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

int main () {
  cout << setw (10);
  cout << 77 << endl;
  return 0;
}
person chris    schedule 11.01.2011
comment
Да, но знаете ли как се отразява? с други думи, smanip изглежда е шаблонен клас, но декацията е smanip setw(int). Не трябва ли да е smanip‹int› setw(int) или нещо подобно? - person Karthick; 11.01.2011