国内约定俗称的具体项目被划分为数个不同的刻面,分别由相应的对象处理。处理“国际化议题中的某一特定刻面”的对象,即称为facet。locale对象是容纳facet的容器。若存取locale的某个刻面,可以相应的facet型别作为索引。如果facet作为模板参数,使用模板的use_facet()函数,可取使用特定的facet。
上述代码用于获取localeloc所管辖的“字符型别为char”的facet numpunct。每个facet均由“定义特定服务”的类别定义。若facet numpunct为格式化数值和布尔值提供服务,下述表达式将返回用以表达true的字符串。
表12-2描述了C++标准程序库中预先定义的facet。每个facet都和类别相关联。这些类别在locale的某些构造函数中用来组合其他locale,并产生新的locale。
表12-2 C++标准程序库预先定义的facet型别
1.标准刻面
程序员可以创建刻面。C++定义了如下7种标准刻面。
1)代码转换。此类刻面可以处理不同字符表示间的转换。例如从多字节字符转换成宽字符。
2)排序。此类刻面可以处理字符排序,用于字符串排序。
3)分类。这类刻面可以处理字符的分类。若设置字符的大小写,或判断某个字符是否属于语言的标点符号组。
4)数字。此类刻面可以处理数字的格式化。
5)货币。此类刻面可以处理货币的格式化。
6)时间和日期。此类刻面可以处理时间和日期的格式化。
7)消息。此类刻面可以处理多种消息类别,使应用程序能够翻译简单的响应,例如“是”和“否”。
2.默认和全局表示
前文曾多次使用区域表示。每个C++程序均在默认的区域表示下运行,即美国的ASCII码表示。C++库创建了该区域的表示对象,即std::locale::classic。std::locale::classic会像其他区域表示一样,决定库函数的显示信息方式。
全局区域表示是当前有效的区域表示。若没有在程序中修改区域表示,则默认和全局区域表示是一样的。全局区域表示可以修改,但默认区域表示不能修改。
3.细述类locale(www.xing528.com)
C++ locale是不变的facet容器,定义于头文件<locale>内。
对于类locale,其存取方式是比较特殊的。locale内含facet,是以facet型别为索引进行存取的。由于每个facet均有不同的界面,且用于不同的目的,所以期望locale的存取函数返回对应索引的型别。以facet型别作为索引的好处是得以拥有型别安全的接口。
locale是不可变的,即存储于locale之内的facet不能被改变。现有的locale和facet组合起来产生新的locale变体。locale类的构造函数存在多种形式,详见表12-3。
表12-3 locale类的构造
几乎所有构造函数均产生某个副本。备份locale是很廉价的操作,基本上只是设定一个指针并将引用计数累加1而已。但产生一个变化过的locale的成本相当大,必须调整locale内每个facet的引用计数值。虽然C++标准没有对此类操作的效率作出任何保证,但是所有实作版本大概都优先照顾locale的备份效率。
表12-3的两个构造函数需要locales名称。除了“C”这个名称,其他名称都没有标准规定。不过C++标准要求每个C++标准库附带的说明文件必须列出可接受的名称。基本上,可以假设大部分实作版本均会接收前面章节所列名称。
成员函数combine()服从最新的编译器特性:一个“带有显式指定之template参数”的成员函数模板。该模板template参数并非由另一个参数隐式推导而来。两个函数用于存取locale对象中的facet,也采用相同的技术。不同之处在于:这两个函数是全局的template函数,不必加模板关键词template。
use_facet()函数会返回指向facet的一个引用(reference)。其型别是显式传递的模板template参数型别。若传入的locale不包含相应的facet,则函数抛出bad_cast异常。has_facet()函数可用于检查某个locale中是否包含特定的facet。详见表12-4。
表12-4 facet的存取
类locales的其他操作列表见表12-5。若某个类locale对象是从某个名称或若干个具名的locale构造而来的,名称将被保存起来。若参与构造的locale包含两个以上,则C++标准并未构造出的名称给予保证。若一个locale是另一个locale的副本,或两个locale名字相同,则两个locale被认为是相同的。locale的名称是被用来创建“具名facet”的名称。运用该体制,两个locale若由具体的相同名称facet参与构造,生成的新名称也相同。C++标准本质上要求“由相同名称的facet组合而成”的locale均相同,才可能精心选出支持上述“相等性”思维。
表12-5 locale的操作函数
小括号操作符使程序员得以运用locale对象作为字符串比较工具。此操作符运用collate facet,按顺序比较参数所传递的字符串,即在判断locale对象掌控时第一个字符串是否小于第二个字符串。这是仿函数的行为。采用locale对象作为STL算法所需的字符串排序规则。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。