6

我在我的整个项目中使用 stringstream,它有 30 多个文件。我最近克服了一个由 stringstring 引起的问题,我将 double 解析为 stringstream 并且丢失了精度。所以现在我想为所有文件设置精度。有没有办法在全局范围内设置它,这样我就不需要在每个文件的任何地方进行更改。有人建议我看看是否可以使用语言环境。

请帮我解决这个问题,如果您有代码或任何代码链接,它将更有用。

4

3 回答 3

7

可能最简单的方法是用您自己的继承自的类替换整个程序中对 stringstream 的使用stringstream

class mystringstream : public std::stringstream
{
public:
   mystringstream()
   {
      precision(16); // or whatever your desired precision is
   }
};

precision方法在 中的继承链中向上定义,并控制有效数字的数量,或者如果操纵器正在运行,则控制std::ios_base小数点后的数字数量。fixed

有关更多示例代码和输出,请参阅键盘上的此粘贴。

于 2010-03-04T21:35:18.813 回答
1

只是为了补充帕特里克的答案,std::ios_base标准中列出了默认精度:

27.4.4.1.3:

表 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
于 2010-03-04T21:57:37.400 回答
0

如果您愿意将所有包含语句更改为您自己的内部标头mystringstream.h,则可以使用模板专业化来实现这一点,但有很多警告我不会这样做。

  • 您必须确保在之前包含的任何地方都sstream使用此标头。
  • 您的 STL 实现必须尚未专门化basic_stringstream <char, char_traits<char>, allocator<char> >
  • 您的 STL 实现或您包含的任何其他标头不得已实例化 stringstream

话虽如此,它在这个简单的键盘示例中起作用。

// 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
    }
  };
}

我个人不喜欢这个解决方案,因为它本质上修改了标准库的行为,而不是扩展它。

于 2010-03-06T00:01:29.510 回答