25

utf8、utf16、utf32、wchar_t (OS によっては utf32 または utf16) など、さまざまなエンコーディングで文字列を取得できる API を構築しています。

  1. 新しい C++ 標準では新しい型が導入されてchar16_tおりchar32_t、この sizeof あいまいさがなく、将来使用する必要があるため、それらもサポートしたいと思いますが、問題は、オーバーロードを許可しない通常の, ,型と干渉するかどうかです。同じタイプを参照できますか?uint16_tuint32_twchar_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 ではないことを確認したいだけです。

4

1 に答える 1

28

1)char16_tchar32_tは異なる新しい型になるため、それらのオーバーロードが可能になります。

ISO/IEC JTC1 SC22 WG21 N2018からの引用:

と同じサイズと表現を持つchar16_t名前を持つ、別個の新しい型への typedef になるように 定義します。同様に、と同じサイズと表現を持つ 名前を持つ、別個の新しい型への typedef になるように定義します。_Char16_tuint_least16_tchar32_t_Char32_tuint_least32_t

詳細な説明 (devx.com の記事「Unicode 革命に備える」から):

typedefと が既に利用可能であるのに、なぜ _Char16_tand型とキーワードが最初に必要なのか疑問に思われるかもしれません。新しい型が解決する主な問題はオーバーロードです。と を引数とする関数をオーバーロードし、 と は異なる などの特殊化を作成できるようになりました。_Char32_tuint_least16_tuint_least32_t_Char16_t_Char32_tstd::basic_string<_Char16_t>std::basic_string <wchar_t>

2)これらは実際に C++0x の一部であり、さまざまな標準ドラフト ペーパーで言及されているように、GCC 主義だけではありu16stringませ。それらは新しいヘッダーに含まれます。同記事より引用:u32string<string>

標準ライブラリは 、次の標準クラスの typedef などと同様に 、 typedefも提供_Char16_tします。_Char32_twstringwcout

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

于 2009-05-16T14:30:20.960 に答える