Domanda

Sono buiding un'API che mi permette di recuperare stringhe in varie codifiche, tra cui utf8, UTF16, UTF-32 e wchar_t (che può essere UTF-32 o UTF16 secondo il sistema operativo).

  1. Nuovo standard C ++ aveva introdotto nuovi tipi char16_t e char32_t che non hanno questa sizeof ambiguità e dovrebbero essere utilizzati in futuro, quindi vorrei sostenerli pure, ma la domanda è: < strong> avrebbero interferire con uint16_t normale, uint32_t, wchar_t tipi non permettendo sovraccarico perché possono riferirsi a stesso 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
    };
    

    Quindi posso solo scrivere:

    foo.set(U"Some utf32 String");
    foo.set(u"Some utf16 string");
    
  2. Quali sono le typedef di std::basic_string<char16_t> e std::basic_string<char32_t> come oggi:

    typedef basic_string<wchar_t> wstring.
    

    Non riesco a trovare alcun riferimento.

    Edit: in base alle intestazioni di gcc-4.4, che ha introdotto questi nuovi tipi:

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

    Voglio solo fare in modo che questo è requisito standard effettivo e non GCC-ismo.

È stato utile?

Soluzione

1) char16_t e char32_t saranno distinte nuovi tipi, così sovraccarico in pratica, è possibile.

ISO / IEC JTC1 SC22 WG21 N2018 :

  

Definisci _Char16_t essere un typedef per un   distinto nuovo tipo, con il nome   uint_least16_t che ha la stessa dimensione e rappresentazione come _Char32_t.   Analogamente, definire uint_least32_t essere un   typedef ad un nuovo tipo esterno, con   il nome std::basic_string<_Char16_t> che ha lo stesso   dimensioni e rappresentazione come   std::basic_string <wchar_t>.

Ulteriori spiegazioni (da un articolo di devx.com " preparatevi per la rivoluzione Unicode "):

  

Probabilmente vi state chiedendo perché la   u16string e u32string tipi e le parole chiave sono necessarie in primo luogo   quando i typedef <string> e   wstring sono già disponibili.   Il problema principale che i nuovi tipi   risolvere è sovraccarico. Nevica   possibile sovraccaricare funzioni che   prendere wcout e filebuf, streambuf, streampos, streamoff, ios, istream, ostream, fstream, ifstream, ofstream, stringstream, istringstream, ostringstream,   argomenti, e creare specializzazioni   come string   che sono distinti da   <=>.

2) <=> e <=> sono infatti parte di C ++ 0x e non solo GCC'isms, quando sono menzionati in vari progetti di carte standard di . Saranno inclusi nella nuova intestazione <=>. Citazione dal medesimo articolo:

  

La libreria standard fornirà anche   <=> e <=> typedefs, in analogia con il typedef <=>,   <=>, ecc, per le seguenti categorie standard:

     

<=> <=>

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top