0

これが機能しない理由を誰かが説明できますか?

template < typename T > struct tester { static const size_t value = 0; };
template <> struct tester< char > { static const size_t value = 1; };
template <> struct tester< unsigned short > { static const size_t value = 2; };

size_t nTest = tester< wchar_t >::value;

私のコンパイラでwchar_tは、 として typedef されunsigned shortます。基になる型に特殊化があるのに、既定のテンプレートが使用されるのはなぜですか?

編集:OK、だから私はそれが型定義されていることについて間違っていました。インテリセンスは私に何か他のものを見せていました。私のクロスプラットフォームであり、サロゲートの質問は残っています。

wchar_tサイズに応じて作業したいので、これは私に変化球を投げました。

別の関連する質問。wchar_tクロスプラットフォームで作業するにはどうすればよいですか? Windowsでは16ビットで、他の場所では32ビットになる可能性があることを私は知っています。32ビット型として定義されている場合、それは(コンパイラが強制するように)サロゲートペアを使用しないことを意味しますか?

このようなものは機能しますか?

template < typename T, size_t N = sizeof( wchar_t ) > struct remap;
template <> struct remap< wchar_t, 2 > { typedef unsigned short type; };
template <> struct remap< wchar_t, 4 > { typedef unsigned long type; };
4

2 に答える 2

2

C++ 標準でwchar_tは、typedef ではなく一意の型であると指定されています。一部の非準拠の実装、または一部の実装定義のオプションでは、それは typedef である可能性がありますが、これに依存したり、移植可能なコードの特定の型に typedef されていることに依存したりすることはできません。

はい、あなたのremap専門分野は機能します。remap<wchar_t>::typeunsigned long、4 バイトのwchar_tプラットフォームunsigned shortと 2 バイトのプラットフォームになりますwchar_t。もちろん、これらの 2 つのサイズに限定されるわけではなく、2 バイトの値が 16 ビットであることを意味するわけではありません。保持できるwchar_t最大値に基づいて移植可能なコードを書きたい場合は、ではなく、コメント。wchar_tWCHAR_MAXsizeof(wchar_t)

32ビット型として定義されている場合、それは(コンパイラが強制するように)サロゲートペアを使用しないことを意味しますか?

標準は、実際にはwchar_t、人々が通常それを使用したいものに特に役立つ方法で指定していません。の目的は、テキスト処理を容易にするためにwchar_t、現在のロケールの任意の文字が単一の値として表される型を提供することです。wchar_tそのためwchar_t、1) すべてのロケールで同じエンコーディングを使用する必要はなく、2) サロゲート ペアは実際には許可されていません。

Windows の UTF-16 の使用は、サロゲート ペアを必要とする文字を含むロケールをサポートしないことで、その秒ポイントを回避します。つまり、移植可能なコードは、Windows を含むどのプラットフォームでもサロゲート ペアを処理しません。

しかし、はい、32 ビット幅のプラットフォームでは、 UTF-8 をエンコーディングとして使用するロケールに固執する場合は特に、多くのロケールでwchar_tUTF-32 が一般的なエンコーディングです。wchar_tchar

于 2013-07-18T06:43:42.217 に答える