C++ 全局设置stringstream的精度

C++ 全局设置stringstream的精度,c++,stringstream,C++,Stringstream,我在我的整个项目中使用stringstream,它有30多个文件。我最近克服了由stringstring引起的一个问题,在这个问题中,我将double解析为stringstream,并且丢失了一个精度。现在我想设置所有文件的精度。有没有办法在全局范围内设置它,这样我就不需要在每个文件的任何地方进行更改。有人建议我看看是否可以使用locale 请帮助我解决这个问题,如果您有代码或任何代码链接,它将更有用。最简单的方法可能是在整个程序中使用从stringstream继承的您自己的类替换您对strin

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


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

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

class mystringstream : public std::stringstream
{
public:
   mystringstream()
   {
      precision(16); // or whatever your desired precision is
   }
};
precision
方法是在
std::ios_base
的继承链上定义的,并控制有效位数或小数点后的位数(如果
fixed
操纵器正在运行)


有关更多示例代码和输出,请参见

仅为补充Patrick的答案,
std::ios_base
的默认精度在标准中列出:

27.4.4.1.3: 表92:基本ios::init()效果


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

  • 您必须确保在以前包含
    sstream
    的任何地方都使用此标题
  • 您的STL实现必须没有专用的
    basic\u stringstream
  • STL实现或包含的任何其他头必须尚未实例化stringstream
也就是说,它在这个简单的环境中起作用

//mystringstream.h
名称空间标准
{
//这个类的存在只是为了“欺骗”编译器
//将此分配器视为一种新的、不同的类型
类newallocator:公共分配器
{
};
//模板专门化std::stringstream以从基本\u stringstream继承
//使用我们的newallocator代替std::allocator
模板
类基本流
:公共基本流
{
公众:
基本流
{
精度(16);//或者你喜欢的任何精度
}
};
}

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

你能举一个失败数字的例子吗?post在这里已经坐了一个多小时了&你比我快了2分钟。:)+1是的,但我不想进入每个文件并将stringstream更新为mystringstream。我正在寻找一种方法来设置它,如果可能的话。就我所知,没有任何方法可以使用locale或类似的东西来实现这一点。如果我能抽出时间,我还有一两个想法可以尝试。如果你真的想修改STL的行为,那么最好依靠第三方STL实现,比如STLport(),直接修改它。但最好的答案是咬紧牙关,使用我的其他解决方案。30个文件是一个非常小的项目,这就是全局搜索和替换工具的用途。
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
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
    }
  };
}