Я написал свою специализацию каждой виртуальной функции-члена 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.
Опять же, есть ли какой-нибудь способ заставить потоки автоматически подхватить это, вместо того, чтобы наполнять им каждый поток?
использование std::locale::global()
:
std::locale::global(std::locale(std::locale(), new std::ctype<char16_t>()));