Новые символы Юникода в C++0x

Я создаю API, который позволяет мне извлекать строки в различных кодировках, включая utf8, utf16, utf32 и wchar_t (это может быть utf32 или utf16 в зависимости от ОС).

  1. Новый стандарт C++ ввел новые типы char16_t а также char32_t которые не имеют такого размера двусмысленности и должны быть использованы в будущем, поэтому я хотел бы также поддержать их, но вопрос в том, будут ли они мешать нормальному uint16_t, uint32_t, wchar_t типы, не допускающие перегрузки, потому что они могут относиться к одному типу?

    class some_class {
    public:
        void set(std::string); // utf8 string
        void set(std::wstring); // wchar string utf16 or utf32 according
                                 // to sizeof(wchar_t)
        void set(std::basic_string<uint16_t>)
                             // wchar independent utf16 string
        void set(std::basic_string<uint32_t>);
                             // wchar independent utf32 string
    
    #ifdef HAVE_NEW_UNICODE_CHARRECTERS
        void set(std::basic_string<char16_t>)
                             // new standard utf16 string
        void set(std::basic_string<char32_t>);
                             // new standard utf32 string
    #endif
    };
    

    Так что я могу просто написать:

    foo.set(U"Some utf32 String");
    foo.set(u"Some utf16 string");
    
  2. Что такое typedef std::basic_string<char16_t> а также std::basic_string<char32_t> как сегодня есть

    typedef basic_string<wchar_t> wstring.
    

    Я не могу найти ссылку.

    Изменить: в соответствии с заголовками gcc-4.4, которые представили эти новые типы:

    typedef basic_string<char16_t> u16string;
    typedef basic_string<char32_t> u32string;
    

    Я просто хочу убедиться, что это актуальное стандартное требование, а не gcc-ism.

1 ответ

Решение

1) char16_t а также char32_t будут различаться новые типы, поэтому возможна их перегрузка.

Цитата из ISO / IEC JTC1 SC22 WG21 N2018:

определять char16_t быть typedef для отдельного нового типа с именем _Char16_t имеет тот же размер и представление, что и uint_least16_t, Аналогично, определить char32_t быть typedef для отдельного нового типа с именем _Char32_t имеет тот же размер и представление, что и uint_least32_t,

Дальнейшее объяснение (из статьи на devx.com " Приготовьтесь к революции Юникода "):

Вы, наверное, задаетесь вопросом, почему _Char16_t а также _Char32_t типы и ключевые слова нужны в первую очередь, когда typedefs uint_least16_t а также uint_least32_t уже доступны. Основная проблема, которую решают новые типы, - это перегрузка. Теперь возможно перегрузить функции, которые принимают _Char16_t а также _Char32_t аргументы и создать специализации, такие как std::basic_string<_Char16_t> которые отличаются от std::basic_string <wchar_t>,

2) u16string а также u32string действительно являются частью C++0x, а не только GCC'измыми, как они упоминаются в различных стандартных проектах. Они будут включены в новый <string> заголовок. Цитата из той же статьи:

Стандартная библиотека также обеспечит _Char16_t а также _Char32_t typedefs, по аналогии с typedefs wstring, wcout и т. д. для следующих стандартных классов:

filebuf, streambuf, streampos, streamoff, ios, istream, ostream, fstream, ifstream, ofstream, stringstream, istringstream, ostringstream,string

Другие вопросы по тегам