¿Cómo funcionan los manipuladores de flujo con argumentos?

En el libro C ++ de Stroustrup, hay un ejemplo de un manipulador personalizado que toma un argumento (por favor vea el código adjunto). Estoy confundido acerca de cómo se crea la estructura. En particular, parece que hay dos argumentos int para el constructor de "smanip", uno para el puntero de función "ff", uno para "ii". No entiendo cómo se pasa el argumento int para crear la estructura usando:

cout << setprecision(4) << angle;

Además, ¿cuál es el orden en que se llaman estas funciones y cómo se determinan los argumentos de tipo Ch y Tr? Muchas gracias

// 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;

Respuestas a la pregunta(2)

Su respuesta a la pregunta