6

30 を超えるファイルがあるプロジェクト全体で stringstream を使用しています。私は最近、double を stringstream に解析していた stringstring によって引き起こされた問題を克服し、精度が失われました。そこで、すべてのファイルの精度を設定したいと思います。各ファイルのどこにでも変更を加える必要がないように、グローバルに設定する方法はありますか。誰かがロケールを使用して可能かどうかを確認するように提案しました。

問題を解決してください。コードまたはコードへのリンクがあれば、より便利になります。

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

コード例と出力の詳細については、codepad のこの貼り付けを参照してください。

于 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 に答える