wchar_t的模板特化

时间:2013-07-18 05:09:27

标签: c++ templates unicode

有人可以解释为什么这不起作用吗?

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。为什么在基础类型具有特化时使用默认模板?

编辑:好的,所以我对它的类型定义错了。 Intellisense向我展示了别的东西。我的跨平台和代理问题仍然存在。

这让我兴奋不已,因为我想根据它的大小使用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; };

2 个答案:

答案 0 :(得分:2)

C ++标准指定wchar_t是唯一类型而不是typedef。在某些不符合的实现或某些实现定义的选项中,它可能是一个typedef,但您不能依赖它或依赖它对可移植代码中的任何特定类型进行typedef。

是的,您的remap专业化将有效; remap<wchar_t>::type在具有两个字节unsigned long的平台上具有四字节wchar_tunsigned short的平台上为wchar_t。当然wchar_t并不仅限于这两种大小,而且两个字节的值并不意味着它是16位等。如果你想编写基于最大值wchar_t的可移植代码可以容纳你可能会查看WCHAR_MAX或评论中显示的其中一个选项,而不是sizeof(wchar_t)

  

如果它被定义为32位类型,那是否意味着它没有(如编译器强制)使用代理对?

标准实际上并未以对人们通常想要使用它的方式特别有用的方式指定wchar_twchar_t的目的是提供一种类型,其中当前语言环境中的任何字符将表示为单个wchar_t值,以便更轻松地进行文本处理。因此wchar_t 1)不需要在所有语言环境中使用相同的编码,2)代理对不是真正允许的。

Windows使用UTF-16类型通过不支持包含需要代理项对的字符的任何语言环境来绕过该秒数。这意味着可移植代码不会处理任何平台上的代理对,包括Windows。

但是,在具有32位宽wchar_t的平台上,UTF-32是许多语言环境的常见wchar_t编码,特别是如果您坚持使用UTF-8作为{{1}的语言环境编码。

答案 1 :(得分:1)

您可以将模板简化为以下内容,您无需专门化它:

template < typename T > struct tester { static const size_t value = sizeof(T) / 8; };

sizeof(wchar_t)为2的平台上,使用UTF-16,因此代理人适用。

sizeof(wchar_t)为4的平台上,使用UTF-32,因此代理不适用。