我在整个项目中使用stringstream,其中包含30多个文件。我最近克服了一个由stringstring引起的问题,我将double解析为stringstream并且精度丢失了。所以现在我想为所有文件设置精度。有没有办法在全局范围内设置它,这样我就不需要在每个文件的每个地方进行更改。有人建议我查看是否可以使用区域设置。
请帮我解决这个问题,如果您有代码或任何代码链接,它会更有用。
答案 0 :(得分:7)
执行此操作最简单的方法可能是将您在整个程序中使用stringstream替换为自己继承自stringstream
的类:
class mystringstream : public std::stringstream
{
public:
mystringstream()
{
precision(16); // or whatever your desired precision is
}
};
precision
方法在std::ios_base
中的继承链中定义,并控制有效位数,或fixed
操纵器所在的小数点后的位数播放。
有关更多示例代码和输出,请参阅this paste on codepad.
答案 1 :(得分:1)
为了补充Patrick的回答,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
答案 2 :(得分:0)
如果您愿意将所有include语句更改为您自己的内部标题mystringstream.h
,您可以使用模板专业化来解决此问题,但有很多警告我不会这样做。
sstream
。basic_stringstream <char, char_traits<char>, allocator<char> >
话虽如此,它在这个简单的codepad example中起作用。
// 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
}
};
}
我个人不喜欢这个解决方案,因为它实质上修改了标准库的行为,而不是扩展它。