C++ 3d.Комментарии


Манипуляторы, определяемые пользователем - часть 2


/** * Восстанавливает первоначальное форматирование, сохраненное в функции * setFormatting(). */ void restoreFormatting(ostream& os); };

/** * Вспомогательный класс. */ template <class T> class Helper { /** выводимое значение */ const T& val; /** объект для форматирования */ mutable Formatter fmtr;

public: /** * Создает объект по переданным параметрам. */ Helper(const T& val_, const char* form, int arg1, int arg2) : val(val_), fmtr(form, arg1, arg2) {}

/** * Функция для вывода в поток сохраненного значения в заданном формате. */ void putTo(ostream& os) const; };

template <class T> void Helper<T>::putTo(ostream& os) const { fmtr.setFormatting(os); os<<val; fmtr.restoreFormatting(os); }

/** * Оператор для вывода объектов Helper в поток. */ template <class T> inline ostream& operator<<(ostream& os, const Helper<T>& h) { h.putTo(os); return os; } }

/** * Функция-манипулятор, возвращающая объект вспомогательного класса, для * которого переопределен оператор вывода в ostream. Переопределенный оператор * вывода осуществляет форматирование при выводе значения. * @param val значение для вывода * @param form формат вывода: [-|0] [число|*] [.(число|*)] [e|f|g|o|x] * @param arg1 необязательный аргумент, задающий ширину или точность. * @param arg2 необязательный аргумент, задающий точность. * @throws std::invalid_argument если передан аргумент form некорректного * формата. */ template <class T> inline c_form_private::Helper<T> c_form(const T& val, const char* form, int arg1=0, int arg2=0) { return c_form_private::Helper<T>(val, form, arg1, arg2); }

и файла-реализации: #include "c_form.hpp" #include <stdexcept> #include <cctype>

namespace {

/** * Вспомогательная функция для чтения десятичного числа. */ int getval(const char*& iptr) { int ret=0; do ret=ret*10 + *iptr-'0'; while (std::isdigit(*++iptr));

return ret; }

}

c_form_private::Formatter::Formatter(const char* form, int arg1, int arg2) : newFlags(fmtflags()), width(0), prec(0), fill(0) { const char* iptr=form; // текущий символ строки формата




- Начало -  - Назад -  - Вперед -



Книжный магазин