Pergunta

Estou buiding uma API que permite-me para ir buscar cordas em várias codificações, incluindo utf8, UTF16, UTF32 e wchar_t (que pode ser UTF32 ou UTF16 de acordo com OS).

  1. padrão New C ++ introduziu novos tipos char16_t e char32_t que não têm essa ambiguidade sizeof e deve ser usado no futuro, então eu gostaria de apoiá-los, bem como, mas a questão é, seriam eles interferir com uint16_t normal, uint32_t, tipos wchar_t não permitindo sobrecarga porque eles podem se referir a mesmo 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
    };
    

    Então, eu só posso escrever:

    foo.set(U"Some utf32 String");
    foo.set(u"Some utf16 string");
    
  2. O que é o typedef de std::basic_string<char16_t> e std::basic_string<char32_t> como existe hoje:

    typedef basic_string<wchar_t> wstring.
    

    Não consigo encontrar qualquer referência.

    Edit: de acordo com cabeçalhos de gcc-4.4, que introduziram estes novos tipos:

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

    Eu só quero ter certeza de que este é exigência padrão real e não gcc-ismo.

Foi útil?

Solução

1) char16_t e char32_t haverá novos tipos distintos, de modo a sobrecarga sobre eles será possível.

ISO / IEC JTC1 SC22 WG21 N2018 :

Definir char16_t ser um typedef para um novo tipo distinto, com o nome _Char16_t que tem o mesmo tamanho e representação como uint_least16_t. Da mesma forma, definir char32_t ser um typedef para um novo tipo distinto, com o nome _Char32_t que tem o mesmo tamanho e representação quanto uint_least32_t.

Mais explicações (a partir de um artigo devx.com " Prepare-se para a Revolução Unicode "):

Você deve estar se perguntando por que o _Char16_t e _Char32_t tipos e palavras-chave são necessários em primeiro lugar quando os typedefs uint_least16_t e uint_least32_t já estão disponíveis. O principal problema que os novos tipos resolver é a sobrecarga. É neve possível sobrecarregar funções que tomar _Char16_t e _Char32_t argumentos e criar especializações tal como std::basic_string<_Char16_t> que são distintos de std::basic_string <wchar_t>.

2) u16string e u32string são de fato parte do C ++ 0x e não apenas GCC'isms, como eles são mencionados em vários projectos de documentos padrão . Eles serão incluídos no novo cabeçalho <string>. Citar o mesmo artigo:

A Biblioteca Padrão também irá fornecer _Char16_t e _Char32_t typedefs, em analogia com o wstring typedefs, wcout, etc., para as seguintes classes padrão:

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top