带参数的流操纵器是如何工作的? < Stroustrup的C++书中,有一个自定义机械手的例子,它带有一个参数(请参阅附加代码)。我对结构是如何创建的感到困惑。特别是,似乎有两个int参数用于“smanip”的构造函数,一个用于函数指针“ff”,一个用于“ii”。我不明白int参数是如何通过以下方式传递来创建结构的: cout << setprecision(4) << angle; cout

带参数的流操纵器是如何工作的? < Stroustrup的C++书中,有一个自定义机械手的例子,它带有一个参数(请参阅附加代码)。我对结构是如何创建的感到困惑。特别是,似乎有两个int参数用于“smanip”的构造函数,一个用于函数指针“ff”,一个用于“ii”。我不明白int参数是如何通过以下方式传递来创建结构的: cout << setprecision(4) << angle; cout,c++,stream,manipulators,C++,Stream,Manipulators,操纵器函子将函数指针和int作为参数,并在内部存储这两个参数以供以后使用。为了可读性,构造函数的签名可以分为以下两种声明: typedef ios_base& (*f_ptr)(ios_base&,int); smanip( f_ptr f, int ) 也就是说,第一个参数是函数指针,第二个是值 根据示例代码中的执行顺序,首先调用函数setprecision,该函数将函数指针和值存储在smanip对象中并返回它。对象被传递给相应的操作符 召唤 inline smanip se

操纵器函子将函数指针和int作为参数,并在内部存储这两个参数以供以后使用。为了可读性,构造函数的签名可以分为以下两种声明:

typedef ios_base& (*f_ptr)(ios_base&,int);
smanip( f_ptr f, int )
也就是说,第一个参数是函数指针,第二个是值

根据示例代码中的执行顺序,首先调用函数
setprecision
,该函数将函数指针和值存储在
smanip
对象中并返回它。对象被传递给相应的
操作符
召唤

inline smanip setprecision(int n){
    return smanip(set_precision,n);
}
它从指向
set\u precision
函数的指针和
n
创建一个
smanip

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\u base
int
,并通过引用返回
ios\u base

在这一点上,这条线实际上是这样的:

smanip m(&setprecision, 4);
cout << m << (otherstuff);
这将调用
cout.setprecision(n)

因此,这句话的意思是:

std::cout.setprecision(4) << angle;
std::cout.setprecision(4)该代码中实际上没有任何“函数对象”。有三个函数的名称非常相似:
set\u precision
setprecision
ios\u base::setprecision
。如果你没有密切注意,很容易让他们感到困惑。
struct smanip{
    ios_base& (*f) (ios_base&, int);
    int i;
    smanip(ios_base& (*ff)(ios_base&, int), int ii) : f(ff), i(ii){}
};
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);
}
ios_base& set_precision(ios_base& s, int n){
    return s.setprecision(n); // call the member function
}
std::cout.setprecision(4) << angle;