有人可以解释为什么这不起作用吗?
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; };
答案 0 :(得分:2)
C ++标准指定wchar_t
是唯一类型而不是typedef。在某些不符合的实现或某些实现定义的选项中,它可能是一个typedef,但您不能依赖它或依赖它对可移植代码中的任何特定类型进行typedef。
是的,您的remap
专业化将有效; remap<wchar_t>::type
在具有两个字节unsigned long
的平台上具有四字节wchar_t
和unsigned short
的平台上为wchar_t
。当然wchar_t
并不仅限于这两种大小,而且两个字节的值并不意味着它是16位等。如果你想编写基于最大值wchar_t
的可移植代码可以容纳你可能会查看WCHAR_MAX
或评论中显示的其中一个选项,而不是sizeof(wchar_t)
。
如果它被定义为32位类型,那是否意味着它没有(如编译器强制)使用代理对?
标准实际上并未以对人们通常想要使用它的方式特别有用的方式指定wchar_t
。 wchar_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,因此代理不适用。