30 Input/output library [input.output]

30.7 Formatting and manipulators [iostream.format]

30.7.7 Extended manipulators [ext.manip]

Заголовок <iomanip> определяет несколько функций, которые поддерживают экстракторы и вставщики, которые позволяют анализировать и форматировать последовательности и значения за деньги и время.

template <class moneyT> unspecified get_money(moneyT& mon, bool intl = false);

Requires: Тип moneyT должен быть либо long double специализацией basic_­string шаблона (пункт [strings]), либо его специализацией .

Effects: Выражение, in >> get_­money(mon, intl) описанное ниже, ведет себя как formatted input function.

Returns: Объект неопределенного типа, такой что if in является объектом типа, basic_­istream<charT, traits> тогда выражение in >> get_­money(mon, intl) ведет себя так, как если бы оно было вызвано f(in, mon, intl), где функция f определяется как:

template <class charT, class traits, class moneyT>
void f(basic_ios<charT, traits>& str, moneyT& mon, bool intl) {
  using Iter     = istreambuf_iterator<charT, traits>;
  using MoneyGet = money_get<charT, Iter>;

  ios_base::iostate err = ios_base::goodbit;
  const MoneyGet& mg = use_facet<MoneyGet>(str.getloc());

  mg.get(Iter(str.rdbuf()), Iter(), intl, str, err, mon);

  if (ios_base::goodbit != err)
    str.setstate(err);
}

Выражение in >> get_­money(mon, intl) должно иметь тип basic_­istream<charT, traits>& и значение in.

template <class moneyT> unspecified put_money(const moneyT& mon, bool intl = false);

Requires: Тип moneyT должен быть либо long double специализацией basic_­string шаблона (пункт [strings]), либо его специализацией .

Returns: Объект неопределенного типа, такой что if out является объектом типа, basic_­ostream<charT, traits> тогда выражение out << put_­money(mon, intl) ведет себя как formatted output function вызывающий объектf(out, mon, intl), где функция f определяется как:

template <class charT, class traits, class moneyT>
void f(basic_ios<charT, traits>& str, const moneyT& mon, bool intl) {
  using Iter     = ostreambuf_iterator<charT, traits>;
  using MoneyPut = money_put<charT, Iter>;

  const MoneyPut& mp = use_facet<MoneyPut>(str.getloc());
  const Iter end = mp.put(Iter(str.rdbuf()), intl, str, str.fill(), mon);

  if (end.failed())
    str.setstate(ios::badbit);
}

Выражение out << put_­money(mon, intl) должно иметь тип basic_­ostream<charT, traits>& и значение out.

template <class charT> unspecified get_time(struct tm* tmb, const charT* fmt);

Requires: Аргумент tmb должен быть действительным указателем на объект типа struct tm. Аргумент fmt должен быть действительным указателем на массив объектов типа charT с char_­traits<charT>​::​length(fmt) элементами.

Returns: Объект неопределенного типа, такой что if in является объектом типа, basic_­istream<charT, traits> тогда выражение in >> get_­time(tmb, fmt) ведет себя так, как если бы оно было вызвано f(in, tmb, fmt), где функция f определяется как:

template <class charT, class traits>
void f(basic_ios<charT, traits>& str, struct tm* tmb, const charT* fmt) {
  using Iter    = istreambuf_iterator<charT, traits>;
  using TimeGet = time_get<charT, Iter>;

  ios_base::iostate err = ios_base::goodbit;
  const TimeGet& tg = use_facet<TimeGet>(str.getloc());

  tg.get(Iter(str.rdbuf()), Iter(), str, err, tmb,
    fmt, fmt + traits::length(fmt));

  if (err != ios_base::goodbit)
    str.setstate(err);
}

Выражение in >> get_­time(tmb, fmt) должно иметь тип basic_­istream<charT, traits>& и значение in.

template <class charT> unspecified put_time(const struct tm* tmb, const charT* fmt);

Requires: Аргумент tmb должен быть действительным указателем на объект типа struct tm, а аргумент fmt должен быть действительным указателем на массив объектов типа charT с char_­traits<charT>​::​length(​fmt) элементами.

Returns: Объект неопределенного типа, такой что if out является объектом типа, basic_­ostream<charT, traits> тогда выражение out << put_­time(tmb, fmt) ведет себя так, как если бы оно было вызвано f(out, tmb, fmt), где функция f определяется как:

template <class charT, class traits>
void f(basic_ios<charT, traits>& str, const struct tm* tmb, const charT* fmt) {
  using Iter    = ostreambuf_iterator<charT, traits>;
  using TimePut = time_put<charT, Iter>;

  const TimePut& tp = use_facet<TimePut>(str.getloc());
  const Iter end = tp.put(Iter(str.rdbuf()), str, str.fill(), tmb,
    fmt, fmt + traits::length(fmt));

  if (end.failed())
    str.setstate(ios_base::badbit);
}

Выражение out << put_­time(tmb, fmt) должно иметь тип basic_­ostream<charT, traits>& и значение out.