我在我的整个项目中使用 stringstream,它有 30 多个文件。我最近克服了一个由 stringstring 引起的问题,我将 double 解析为 stringstream 并且丢失了精度。所以现在我想为所有文件设置精度。有没有办法在全局范围内设置它,这样我就不需要在每个文件的任何地方进行更改。有人建议我看看是否可以使用语言环境。
请帮我解决这个问题,如果您有代码或任何代码链接,它将更有用。
我在我的整个项目中使用 stringstream,它有 30 多个文件。我最近克服了一个由 stringstring 引起的问题,我将 double 解析为 stringstream 并且丢失了精度。所以现在我想为所有文件设置精度。有没有办法在全局范围内设置它,这样我就不需要在每个文件的任何地方进行更改。有人建议我看看是否可以使用语言环境。
请帮我解决这个问题,如果您有代码或任何代码链接,它将更有用。
可能最简单的方法是用您自己的继承自的类替换整个程序中对 stringstream 的使用stringstream
:
class mystringstream : public std::stringstream
{
public:
mystringstream()
{
precision(16); // or whatever your desired precision is
}
};
该precision
方法在 中的继承链中向上定义,并控制有效数字的数量,或者如果操纵器正在运行,则控制std::ios_base
小数点后的数字数量。fixed
有关更多示例代码和输出,请参阅键盘上的此粘贴。
只是为了补充帕特里克的答案,std::ios_base
标准中列出了默认精度:
表 92:basic_ios::init() 效果
Element Value
rdbuf() sb
tie() 0
rdstate() goodbit if sb is not a null pointer, otherwise badbit.
exceptions() goodbit
flags() skipws | dec
width() 0
precision() 6
fill() widen(’ ’);
getloc() a copy of the value returned by locale()
iarray a null pointer
parray a null pointer
如果您愿意将所有包含语句更改为您自己的内部标头mystringstream.h
,则可以使用模板专业化来实现这一点,但有很多警告我不会这样做。
sstream
使用此标头。basic_stringstream <char, char_traits<char>, allocator<char> >
话虽如此,它在这个简单的键盘示例中起作用。
// mystringstream.h
namespace std
{
// This class exists solely to "trick" the compiler into
// considering this allocator a new, different type
class newallocator : public allocator<char>
{
};
// template specialize std::stringstream to inherit from basic_stringstream
// using our newallocator in place of std::allocator<char>
template <>
class basic_stringstream<char, char_traits<char>, allocator<char> >
: public basic_stringstream <char, char_traits<char>, newallocator >
{
public:
basic_stringstream()
{
precision(16); // or whatever precision you like
}
};
}
我个人不喜欢这个解决方案,因为它本质上修改了标准库的行为,而不是扩展它。