GCC, специализация std :: ctype & amp; потоки

Я написал свою специализацию каждой виртуальной функции-члена std::ctype<char16_t>, так что теперь это работает:

#include <string>
#include <locale>
#include "char16_facets.h"  // Header containing my ctype specialisation
#include <sstream>
#include <iostream>

// Implemented elsewhere using iconv
std::string Convert(std::basic_string<char16_t>);

int main() {
std::basic_string<char16_t> s("Hello, world.");
std::basic_stringstream<char16_t> ss(s);
ss.imbue(std::locale(ss.getloc(), new std::ctype<char16_t>()));
std::basic_string<char16_t> t;
ss >> t;
std::cout << Convert(t) << " ";
ss >> t;
std::cout << Convert(t) << std::endl;
}

Есть ли способ заставить потоки использовать новую специализацию ctype по умолчанию, поэтому мне не нужно imbue каждый поток с новой локалью?

Я не написал новый класс, только при условии

template<>
inline bool std::ctype<char16_t>::do_is (std::ctype_base::mask m, char16_t c) const {

и т. д. Я как бы надеялся, что он будет получен автоматически, если он был объявлен до #include <sstream> но это не так.

Большая часть работы над этим была выполнена с использованием G ++ и libstdc ++ 4.8, но я получаю тот же результат с ними, построенными из магистрали SVN.

Редактировать — Обновить Этот вопрос изначально задавался о том, как заставить работать извлечение чисел. Тем не менее, учитывая поток пропитан правильным ctype а также numpunct реализации, то нет специализации num_get является необходимым; просто

ss.imbue(std::locale(ss.getloc(), new std::num_get<char16_t>()));

и это будет работать с любой версией gcc.

Опять же, есть ли какой-нибудь способ заставить потоки автоматически подхватить это, вместо того, чтобы наполнять им каждый поток?

1

Решение

использование std::locale::global():

std::locale::global(std::locale(std::locale(), new std::ctype<char16_t>()));
3

Другие решения


По вопросам рекламы [email protected]