Установка точности для stringstream глобально

Я использую stringstream в своем всем проекте, который имеет больше чем 30 файлов. Я недавно overcomed проблема, вызванная stringstring, где я анализировал вдвое большее по сравнению с stringstream и, был потерянной точностью. Таким образом, теперь я хочу установить точность для всех файлов. Есть ли любой способ установить его где-нибудь глобально так, чтобы я не должен был вносить изменения, везде входящие в каждый файл. Кто-то предложил, чтобы я видел если его возможная локаль использования.

Выручите меня с проблемой и если у Вас будут код или какая-либо ссылка на код, то это будет более полезно.

6
задан rkb 4 March 2010 в 20:19
поделиться

3 ответа

Вероятно, самый простой способ сделать это - заменить использование stringstream во всей программе на ваш собственный класс, который наследуется от stringstream :

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

Метод precision определен вверх по цепочке наследования в std :: ios_base и контролирует количество значащие цифры или количество цифр после десятичной дроби, если используется манипулятор fixed .

Для получения дополнительных примеров кода и вывода см. эту вставку на кодовой панели.

7
ответ дан 16 December 2019 в 21:38
поделиться

Чтобы добавить к ответу Патрика, уточнения по умолчанию для std :: ios_base изложены в Стандарте:

27.4.4.1.3:

Таблица 92 : basic_ios :: init () effects

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
1
ответ дан 16 December 2019 в 21:38
поделиться

Если вы хотите изменить все свои инструкции include на свой собственный внутренний заголовок mystringstream.h , вы можете использовать специализацию шаблона для справиться с этим, но с таким количеством предостережений я бы не стал этого делать.

  • Вы должны обязательно использовать этот заголовок везде, вы бы включили sstream ранее.
  • Ваша реализация STL не должна уже иметь специализированный basic_stringstream , allocator >
  • Ваша реализация 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
    }
  };
}

Мне лично не нравится это решение, потому что оно существенно изменяет поведение стандартной библиотеки, а не расширяет ее.

0
ответ дан 16 December 2019 в 21:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: