Какая цель imbue в С++?
Сегодня я работаю с некоторым кодом, и я увидел:
extern std::locale g_classicLocale;
class StringStream : public virtual std::ostringstream
{
public:
StringStream() { imbue(g_classicLocale); }
virtual ~StringStream() {};
};
Затем я столкнулся с imbue
. Какова цель функции imbue
в С++? Что оно делает? Существуют ли какие-либо потенциальные проблемы при использовании imbue
(без потоковой безопасности, выделения памяти)?
Ответы
Ответ 1
imbue
наследуется std::ostringstream
от std::ios_base
и устанавливает локаль поток в указанную локаль.
Это влияет на то, как поток печатает (и читает) определенные вещи; например, установка французского языка приведет к замене десятичной точки .
на ,
.
Ответ 2
Потоки С++ выполняют свои преобразования в и из (числовых) типов в соответствии с locale
, который представляет собой объект, который суммирует всю необходимую информацию о локализации (десятичный разделитель, формат даты,...).
По умолчанию для потоков используется текущая глобальная локаль, но вы можете установить для потока пользовательский языковой стандарт с помощью функции imbue
, что и делает ваш код здесь - я полагаю, он установил локаль C по умолчанию для создания текущий языковой независимый текст (это полезно, например, для целей сериализации).