2009-05-16 13 views
25

私は、utf8、utf16、utf32、wchar_t(OSによってはutf32またはutf16かもしれません)を含むさまざまなエンコーディングで文字列を取得できるAPIを作成しています。新しいC++標準では、このはsizeofの曖昧さを持っていないと、将来的に使用しなければならないので、私は同様にそれらをサポートしたいと思いますが、質問がある新しいタイプchar16_tchar32_tを導入していたC++の新しいユニコード文字0x

  1. 彼らが干渉するは通常の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. を今日があるようstd::basic_string<char16_t>std::basic_string<char32_t>のtypedefはどのようなものです:

    typedef basic_string<wchar_t> wstring. 
    

    私はすべての参照を見つけることができません。

    編集:私はちょうどこれは、実際の標準的な要件であることを確認してくださいとgcc-ISMないようにしたい

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

    :これらの新しいタイプを導入GCC-4.4のヘッダに記載の方法。

+0

私の些細なことを意図せずに戻したようです。/干渉/干渉/スペリングcorr 。 – ephemient

+0

ありがとうございました。修正を元に戻しました。 – Artyom

答えて

30

1)char16_tchar32_tは異なった新しいタイプになりますので、それらに過負荷にすることは可能になります。 ISO/IEC JTC1 SC22 WG21 N2018から

引用:

uint_least16_tと同じサイズと表現を持つ名前 _Char16_tと、 異なる新しいタイプへのtypedefであることchar16_tを定義します。 同様に、 名uint_least32_t同じ サイズ及び表現を有する_Char32_tと、別個の新しいタイプに のtypedefであることchar32_tを定義します。

(devx.comの記事「 Prepare Yourself for the Unicode Revolution」から)

さらなる説明:

_Char16_t_Char32_t種類やキーワードが最初の場所で必要とされる理由はおそらく迷っている ときのtypedef uint_least16_tuint_least32_tはすでに利用可能です。 新しいタイプ が解決する主な問題は、オーバーロードです。それは_Char16_t_Char32_t の引数を取り、 std::basic_string <wchar_t>区別されるようにstd::basic_string<_Char16_t> などの専門分野 を作成 機能をオーバーロードすることができるようになりまし です。

2)u16stringu32stringそれらがvarious standard draft papersに記載されているように、確かにC++ 0xのだけではなくGCC'ismsの一部です。それらは新しい<string>ヘッダーに含まれます。同じ記事からの引用:

標準ライブラリには、次の標準クラスのために、などのtypedef wstringwcout、と同様に _Char16_t_Char32_tのtypedefを、提供します:

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

+0

ありがとう、本当に役に立ちました! – Artyom

+1

標準のドラフトによると、 'char16/32_t'はtypedefではなくキーワードです。誰が正しい? – Philipp

+0

gccバージョン4.7.3では、char16_t/char32_tはキーワードです。私がチェックしました。あなたは 'int32_t'(それはtypedefです)という変数を定義することはできますが、' char32_t'(それはキーワードです)を定義することはできません。 –

関連する問題