Я использую stringstream в своем всем проекте, который имеет больше чем 30 файлов. Я недавно overcomed проблема, вызванная stringstring, где я анализировал вдвое большее по сравнению с stringstream и, был потерянной точностью. Таким образом, теперь я хочу установить точность для всех файлов. Есть ли любой способ установить его где-нибудь глобально так, чтобы я не должен был вносить изменения, везде входящие в каждый файл. Кто-то предложил, чтобы я видел если его возможная локаль использования.
Выручите меня с проблемой и если у Вас будут код или какая-либо ссылка на код, то это будет более полезно.
Вероятно, самый простой способ сделать это - заменить использование stringstream во всей программе на ваш собственный класс, который наследуется от stringstream
:
class mystringstream : public std::stringstream
{
public:
mystringstream()
{
precision(16); // or whatever your desired precision is
}
};
Метод precision
определен вверх по цепочке наследования в std :: ios_base
и контролирует количество значащие цифры или количество цифр после десятичной дроби, если используется манипулятор fixed
.
Для получения дополнительных примеров кода и вывода см. эту вставку на кодовой панели.
Чтобы добавить к ответу Патрика, уточнения по умолчанию для std :: ios_base
изложены в Стандарте:
Таблица 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
Если вы хотите изменить все свои инструкции include на свой собственный внутренний заголовок mystringstream.h
, вы можете использовать специализацию шаблона для справиться с этим, но с таким количеством предостережений я бы не стал этого делать.
sstream
ранее. basic_stringstream , allocator >
При этом он работал в этом простом примере кодовой панели .
// 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
}
};
}
Мне лично не нравится это решение, потому что оно существенно изменяет поведение стандартной библиотеки, а не расширяет ее.