gpt4 book ai didi

c++ - 带参数的流操纵器如何工作?

转载 作者:可可西里 更新时间:2023-11-01 17:42:28 26 4
gpt4 key购买 nike

在 Stroustrup 的 C++ 书中,有一个带有参数的自定义操纵器的示例(请参阅附加代码)。我对结构的创建方式感到困惑。特别是,看起来“smanip”的构造函数有两个 int 参数,一个用于函数指针“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;

最佳答案

setprecision(4)

通话

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

它从指向 set_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_baseint,并通过引用返回 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);
}

并且编译器可以从左侧的流中推导出ChTr。在这种情况下,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;

关于c++ - 带参数的流操纵器如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7935181/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com