Я пытаюсь использовать свой собственный codecvt
со стандартными iostreams. Я использую эту строку:
std::cout.imbue(std::locale(std::locale("C"), new rot13codecvt()));
rot13codecvt
это просто пример, бесстыдно поднятый дословно от Interwebs. Полный работоспособный пример Вот. Мой настоящий codecvt делает что-то другое.
Как вы можете видеть в связанном живом примере, это не довольно работать в g ++. Выходной сигнал не рот13д. Никакая функция из пользовательского класса codecvt никогда не вызывается. Но это хорошо работает в VS2012.
Я пробовал другие локали, кроме «C», и ни одна из них не работает. Также попробовал пример Вот, тот же результат.
Что я делаю неправильно?
Для использования требуются только файловые потоки std::codecvt<...>
и не требуется, чтобы какой-либо из стандартных объектов потока был реализован в терминах файловых потоков. Есть причины для исполнителей любого выбора. Реализация Dinkumware использует <stdio.h>
для большинства его операций и имеет смысл использовать ту же реализацию под капотом в этом случае. libstdc ++ избегает некоторых издержек и напрямую обращается к буферу, совместно используемому между стандартными потоками C и C ++, и, таким образом, использует другую реализацию потока.
При использовании файловых потоков использование std::codecvt<...>
грани должны быть последовательными.
Библиотека libstdc ++, поставляемая с g ++, пока не реализует стандарт c ++ 11. На моей версии <codecvt>
заголовок отсутствует вообще.
f.jardon@xxxx 14:40:40 ~
$ find /usr/lib/gcc/x86_64-pc-cygwin/4.9.2/ -name codecvt
f.jardon@xxxx 14:41:17 ~
И это не единственное, чего не хватает:
f.jardon@xxxx 14:46:22 ~
$ grep -rl wbuffer_convert 'c:/Program Files (x86)/Microsoft Visual Studio 12.0/VC/include/'
c:/Program Files (x86)/Microsoft Visual Studio 12.0/VC/include/cvt/wbuffer
c:/Program Files (x86)/Microsoft Visual Studio 12.0/VC/include/cvt/xtest
c:/Program Files (x86)/Microsoft Visual Studio 12.0/VC/include/xlocbuf
f.jardon@xxxx 14:46:25 ~
$ grep -rl wbuffer_convert /usr/lib/gcc/x86_64-pc-cygwin/4.9.2/include/c++/
Заголовок codecvt существует с gcc 5.1.