LINUX.ORG.RU

cout для u32string

 ,


0

1

Как правильно научить стандартный поток вывода правильно отображать u32string?
Хочется в итоге получить что-то типа этого: u32cout << U"testing";

★★★★★

Ответ на: комментарий от yoghurt

Отлично, с константами работает, а вот с переменными типа u32string нет. Ругается, что поток для wchar_t, а я ему пытаюсь скормить строку из u32chat_t...

deterok ★★★★★
() автор топика
Ответ на: комментарий от yoghurt

Походу встроенного функционала нет...
Пока нашел вот такое решение здесь

const char32_t *s5 = U"Euros \u20AC and G clef \U0001D11E";
// UTF-8 encoded should work to wcout if 
//wcout << s3 << endl; // doesn't on my system... :(

// this should create a method to write a char32_t string to cout
// but it doesn't work with any STL I can find... :(

wbuffer_convert<codecvt_utf8<char32_t>,char32_t> u32buffer(cout.rdbuf(),new codecvt_utf8<char32_t>());
std::basic_ostream<char32_t> u32out(&u32buffer);
u32out << s5 << endl;

Сейчас буду пробовать.
Кстати, насколько нормально так делать:
wbuffer_convert<codecvt_utf8<char32_t>,char32_t> u32buffer(cout.rdbuf(),new codecvt_utf8<char32_t>());
Я имею ввиду new
Утечка?

deterok ★★★★★
() автор топика
Последнее исправление: deterok (всего исправлений: 1)
Ответ на: комментарий от deterok

Кстати, насколько нормально так делать:

Конкретно в этом случае - почти нормально, т.к.

The constructed object acquires ownership of this conversion object, which is automatically destroyed (with operator delete) when this object is destroyed.

Почти, потому что порядок вычисления аргументов ф-ии/метода (когда-то был?) не определён, и в общем виде для

foo(bar(), new Baz)

у тебя может вызваться сначала new Baz, потом bar(), который кинет исключение и до foo() дело уже не дойдёт. Тогда созданный Baz будет потерян.

yoghurt ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.