Как работают потоковые манипуляторы с аргументами?

В книге Страуструпа по С ++ приведен пример пользовательского манипулятора, принимающего аргумент (см. Прилагаемый код). Я запутался в том, как создается структура. В частности, похоже, что есть два аргумента int для конструктора «smanip», один для указателя функции «ff», другой для «ii». Я не понимаю, как аргумент int передается для создания структуры с помощью:

cout << setprecision(4) << angle;

Кроме того, каков порядок вызова этих функций и как определяются аргументы типа Ch и Tr? Большое спасибо.

// manipulator taking arguments
struct smanip{
    iso_base& (*f) (ios_base&, int);
    int i;
    smanip(ios_base& (*ff)(ios_base&, int), int ii) : f(ff), i(ii){}
};

template<cladd Ch, class Tr>
ostream<Ch, Tr>& operator<<(ostream<Ch, Tr>& os, smanip& m){
    return m.f(os, m.i);
}

ios_base& set_precision(ios_base& s, int n){
    return s.setprecision(n); // call the member function
}

inline smanip setprecision(int n){
    return smanip(set_precision,n);
}

// usage:
cout << setprecision(4) << angle;

Ответы на вопрос(2)

Ваш ответ на вопрос