Como os manipuladores de fluxo com argumentos funciona

o livro C ++ do Stroustrup, há um exemplo de um manipulador personalizado usando um argumento (veja o código em anexo). Estou confuso sobre como a estrutura é criada. Em particular, parece que existem dois argumentos int para o construtor de "smanip", um para o ponteiro de função "ff" e outro para "ii". Não entendo como o argumento int é passado para criar a estrutura usando:

cout << setprecision(4) << angle;

Além disso, qual é a ordem em que essas funções são chamadas e como os argumentos de tipo Ch e Tr são determinados? Muito obrigado

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

questionAnswers(2)

yourAnswerToTheQuestion