Почему cout возвращает smanip? - PullRequest
2 голосов
/ 11 января 2011

Может кто-нибудь объяснить мне объявление манипулятора setw? Я был полностью сбит с толку, пытаясь понять это! Объявление setw в iomanip выглядит следующим образом

 smanip setw(int)

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

Ответы [ 2 ]

4 голосов
/ 11 января 2011

smanip является типом, определяемым реализацией. Библиотека может определять или вводить ее по своему усмотрению, если работа выполнена.

На практике это будет какая-то структура, представляющая (а) выполняемую манипуляцию и (b) аргумент 10, который будет использоваться в этой манипуляции. У него также может быть функция для выполнения манипуляции, а может и нет, в зависимости от того, как реализация определила operator<<(ostream &, smanip), или некоторая аналогичная перегрузка для захвата необходимых типов операндов. Я не проверил свою реализацию, чтобы узнать.

Что касается влияния на вывод: my_stream << setw(10) определено так же, как и вызов my_stream.width(10) для потока. Таким образом, перегрузка operator<< гарантирует, что это произойдет каким-то образом, зависящим от реализации. Перегрузка оператора для не параметризованных потоковых манипуляторов определена специально для вызова манипулятора, но с smanip есть немного больше свободы для реализаций.

0 голосов
/ 11 января 2011

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

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

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