Question

Je buiding une API qui me permet de chaînes dans diverses aille chercher encodages, y compris UTF8, utf16, UTF32 et wchar_t (qui peut être UTF32 ou utf16 selon OS).

  1. Nouveau standard C ++ a introduit de nouveaux types et char16_t qui n'ont char32_t pas cette ambiguïté sizeof et devraient être utilisés à l'avenir, donc je voudrais les soutenir aussi bien, mais la question est, < strong> seraient-ils interférer avec la normale uint16_t, uint32_t, types ne permettant pas wchar_t surcharge car ils peuvent se référer à un même type?

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

    Je peux simplement écrire:

    foo.set(U"Some utf32 String");
    foo.set(u"Some utf16 string");
    
  2. Quels sont les typedef et std::basic_string<char16_t> comme il y a std::basic_string<char32_t> aujourd'hui:

    typedef basic_string<wchar_t> wstring.
    

    Je ne peux trouver aucune référence.

    Edit: selon les en-têtes de gcc-4,4, qui ont introduit ces nouveaux types:

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

    Je veux juste vous assurer que c'est une exigence standard réelle et non gcc-isme.

Était-ce utile?

La solution

1) et char16_t seront distincts char32_t nouveaux types, la surcharge ainsi de leur sera possible.

Citation de ISO / IEC JTC1 SC22 WG21 N2018 :

  

Définir être un _Char16_t typedef à un   nouveau type distinct, avec le nom   Qui a la uint_least16_t même taille et la représentation que _Char32_t.   De même, définir comme un uint_least32_t   typedef à un nouveau type distinct, avec   le nom qui a le std::basic_string<_Char16_t> même   la taille et la représentation en tant que   std::basic_string <wchar_t>.

Des explications complémentaires (d'un article devx.com « Preparez-vous pour la Révolution Unicode "):

  

Vous vous demandez probablement pourquoi la   Et types u16string et mots-clés u32string sont nécessaires en premier lieu   lorsque les typedefs et <string>   Sont déjà disponibles wstring.   Le principal problème que les nouveaux types   résoudre est la surcharge. La neige   possible de surcharger des fonctions   prendre et wcout filebuf, streambuf, streampos, streamoff, ios, istream, ostream, fstream, ifstream, ofstream, stringstream, istringstream, ostringstream,   arguments, et créer des spécialisations   comme string   qui sont distincts   <=>.

2) et <=> sont en effet partie <=> de C ++ 0x et pas seulement GCC'isms, comme ils sont mentionnés dans divers documents de projet de norme . Ils seront inclus dans le nouvel en-tête de <=>. Citation du même article:

  

La bibliothèque standard sera également fournir   Et typedefs <=> <=>, par analogie avec les typedefs <=>,   <=>, etc., pour les classes standard suivantes:

     

<=> <=>

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top