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