setprecision(4)
звонки
inline smanip setprecision(int n){
return smanip(set_precision,n);
}
, который создает smanip
из указателя на функцию set_precision
и n
.
struct smanip{
ios_base& (*f) (ios_base&, int);
int i;
smanip(ios_base& (*ff)(ios_base&, int), int ii) : f(ff), i(ii){}
};
smanip
- это структура, которая содержит указатель на функцию и целое число. Эта функция принимает ios_base
по ссылке и int
и возвращает ios_base
по ссылке.
На этом этапе линия выглядит примерно так:
smanip m(&setprecision, 4);
cout << m << (otherstuff);
что соответствует этому шаблону:
template<class Ch, class Tr>
ostream<Ch, Tr>& operator<<(ostream<Ch, Tr>& os, smanip& m){
return m.f(os, m.i);
}
И компилятор может вывести Ch
и Tr
из потока на левой стороне. В этом случае std::cout
. Код выполняет m.f(os, m.i)
. Это вызывает указатель функции, удерживаемый smanip
, передавая ему поток, а целое число удерживается smanip
.
ios_base& set_precision(ios_base& s, int n){
return s.setprecision(n); // call the member function
}
Звонит cout.setprecision(n)
.
Таким образом, строка переводится в:
std::cout.setprecision(4) << angle;