Pregunta

Estoy buiding una API que permite a mí para buscar cadenas en diferentes codificaciones, incluyendo utf8, utf16, utf32 y wchar_t (que puede ser utf32 o utf16 de acuerdo a OS).

  1. Nuevo estándar de C++ habían introducido nuevos tipos de char16_t y char32_t que no tienen este sizeof ambigüedad y debe ser utilizado en el futuro, así que me gustaría apoyar, pero la pregunta es, iban a interferir con normal uint16_t, uint32_t, wchar_t tipos de no permitir la sobrecarga porque pueden referirse al mismo tipo?

    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
    };
    

    Así que sólo puedo escribir:

    foo.set(U"Some utf32 String");
    foo.set(u"Some utf16 string");
    
  2. ¿Cuáles son las definiciones de std::basic_string<char16_t> y std::basic_string<char32_t> como hay hoy en día:

    typedef basic_string<wchar_t> wstring.
    

    No puedo encontrar ninguna referencia.

    Editar:de acuerdo a los encabezados de gcc-4.4, que introducen estos nuevos tipos:

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

    Sólo quiero para asegurarse de que esto es real requisito estándar y no gcc-ism.

¿Fue útil?

Solución

1) char16_t y char32_t serán distintos tipos nuevos, por lo que la sobrecarga de ellos será posible.

Cita de ISO/IEC JTC1 SC22 WG21 N2018:

Definir char16_t para ser un typedef para un distintas nuevo tipo, con el nombre de _Char16_t que tiene el mismo tamaño y la representación como uint_least16_t.Asimismo, definir char32_t para ser un typedef a distintas nuevo tipo, con el nombre _Char32_t que tiene el mismo el tamaño y la representación como uint_least32_t.

La explicación adicional (a partir de un devx.com el artículo "Prepárate para la Revolución Unicode"):

Probablemente te estés preguntando por qué la _Char16_t y _Char32_t tipos y las palabras clave que se necesitan en el primer lugar cuando el typedefs uint_least16_t y uint_least32_t ya están disponibles.El principal problema que los nuevos tipos resolver es la sobrecarga.Ahora posible sobrecarga de funciones que tomar _Char16_t y _Char32_t los argumentos, y crear especializaciones como std::basic_string<_Char16_t> que son distintos de std::basic_string <wchar_t>.

2) u16string y u32string son de hecho parte de C++0x y no sólo GCC'isms, como son mencionados en varios borrador de estándar de documentos.No estarán incluidos en el nuevo <string> encabezado.Cita del mismo artículo:

La Biblioteca Estándar también se proporcionan _Char16_t y _Char32_t las definiciones de tipos, en analogía a la typedefs wstring, wcout, etc., para el siguiente modelo de clases:

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top