这是一个学校的练习,所以请提供一些提示,没有完整的例子;-)
我有自己的操纵者:
template<typename T, typename Tr=char_traits<T> >
ios_base& toggle(basic_ios<T,Tr>& io)
{
if(io.flags() & ios::scientific)
{ io.unsetf(ios::scientific); io.flags(ios::fixed); }
else { io.unsetf(ios::fixed); io.flags(ios::scientific); }
return io;
}
Run Code Online (Sandbox Code Playgroud)
我写了这个,因为我必须用表单编写一个操纵器ios_base& my_manip(basic_ios&).
如果我像这样使用它(不使用返回值):
toggle(cout);
Run Code Online (Sandbox Code Playgroud)
......工作正常 但如果我这样使用它:
toggle(cout) << 54444.6456555 << endl;
Run Code Online (Sandbox Code Playgroud)
这不起作用(因为std :: ios_base没有如下所述的operator <<()).
一般来说,我没有得到ios_base& my_manip(basic_ios&)有用的东西......你有一个提示/例子吗?
你们已经帮了我很多!我仍然不明白,是通过basic_ios和回馈的动机ios_base(因为建议在我必须解决的练习中做...).什么可能是使用这个???
操纵器的问题是它返回一个std::ios_base&而不是std::ostream&您可以写入的。您可以更改操纵器以采用std::ostream&as 参数并返回收到的引用。但是,输出流类定义了采用函数指针的输出运算符:
std::ostream& std::ostream::operator<< (std::ios_base& (*)(std::ios_base&)) { ... }
Run Code Online (Sandbox Code Playgroud)
也就是说,您可以按照几乎相同的方式插入操纵器,例如std::hex:
std::cout << std::hex << 123 << ' ' << std::dec << 123 << '\n';
Run Code Online (Sandbox Code Playgroud)