Почему cout возвращает smanip?

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

 smanip setw(int)

теперь что такое сманип? что происходит, когда мы даем 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 Function1 { std::cout.width(10); std::cout.fill('*'); } int main() { Function1(); 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