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类型定义为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; };
4

2 回答 2

2

C++ 标准指定它wchar_t是唯一类型而不是 typedef。在一些不符合规范的实现中,或者在一些实现定义的选项中,它可能是一个 typedef,但你不能依赖它或依赖它被 typedef 到可移植代码中的任何特定类型。

是的,你的remap专长会起作用;remap<wchar_t>::typeunsigned long在具有四个字节wchar_tunsigned short平台上和具有两个字节的平台上wchar_t。当然wchar_t不限于这两种大小,两个字节的值并不意味着它是 16 位等。如果您想根据wchar_t可以容纳的最大值编写可移植代码,您可以查看WCHAR_MAX或中显示的选项之一评论,而不是sizeof(wchar_t).

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

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

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

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

于 2013-07-18T06:43:42.217 回答
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,因此不适用代理。

于 2013-07-19T04:02:15.943 回答