На этом шаге мы рассмотрим создание пользовательских манипуляторов.
В программе можно определять нестандартные (пользовательские) манипуляторы. Все, что для этого нужно, - написать функцию наподобие приведенной ранее функции endl(). Например, следующая функция определяет манипулятор, который игнорирует все символы до конца строки:
#include <istream> #include <limits> template <class charT, class traits> inline std::basic_istream<charT,traits>& ignoreLine (std::basic_istream<charT,traits>& strm) { // Пропуск символов до конца строки strm.ignore(std::numeric_limits<int>::max(),strm.widen('\n')); // Возвращение strm для организации цепочечных вызовов return strm; }
Манипулятор просто поручает работу функции ignore(), которая игнорирует все символы до конца строки (функция ignore() описана на 479 шаге). Применение манипулятора выглядит очень просто:
// Пропустить символы до конца строки
std::cin >> ignoreLine;
Многократный вывод манипулятора позволяет проигнорировать сразу несколько строк:
// Пропустить две строки
std::cin >> ignoreLine >> ignoreLine;
Такая конструкция работает, поскольку вызов функции ignore (max, с) означает пропуск всех символов, пока не обнаружится символ с во входном потоке данных (или пока не будет прочитано максимальное количество символов, или пока не будет достигнут конец потока данных). Но этот символ также пропускается перед возвращением из функции.
Со следующего шага мы начнем рассматривать форматирование.