首页 理论教育 STL标准库facet介绍

STL标准库facet介绍

时间:2023-10-25 理论教育 版权反馈
【摘要】:locale对象是容纳facet的容器。这些类别在locale的某些构造函数中用来组合其他locale,并产生新的locale。locale是不可变的,即存储于locale之内的facet不能被改变。两个函数用于存取locale对象中的facet,也采用相同的技术。若传入的locale不包含相应的facet,则函数抛出bad_cast异常。locale的名称是被用来创建“具名facet”的名称。运用该体制,两个locale若由具体的相同名称facet参与构造,生成的新名称也相同。

STL标准库facet介绍

国内约定俗称的具体项目被划分为数个不同的刻面,分别由相应的对象处理。处理“国际化议题中的某一特定刻面”的对象,即称为facet。locale对象是容纳facet的容器。若存取locale的某个刻面,可以相应的facet型别作为索引。如果facet作为模板参数,使用模板的use_facet()函数,可取使用特定的facet。

978-7-111-51399-5-Chapter12-14.jpg

上述代码用于获取localeloc所管辖的“字符型别为char”的facet numpunct。每个facet均由“定义特定服务”的类别定义。若facet numpunct为格式化数值和布尔值提供服务,下述表达式将返回用以表达true的字符串。

978-7-111-51399-5-Chapter12-15.jpg

表12-2描述了C++标准程序库中预先定义的facet。每个facet都和类别相关联。这些类别在locale的某些构造函数中用来组合其他locale,并产生新的locale。

12-2 C++标准程序库预先定义的facet型别

978-7-111-51399-5-Chapter12-16.jpg

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>内。

978-7-111-51399-5-Chapter12-17.jpg

978-7-111-51399-5-Chapter12-18.jpg

对于类locale,其存取方式是比较特殊的。locale内含facet,是以facet型别为索引进行存取的。由于每个facet均有不同的界面,且用于不同的目的,所以期望locale的存取函数返回对应索引的型别。以facet型别作为索引的好处是得以拥有型别安全的接口

locale是不可变的,即存储于locale之内的facet不能被改变。现有的locale和facet组合起来产生新的locale变体。locale类的构造函数存在多种形式,详见表12-3。

12-3 locale类的构造

978-7-111-51399-5-Chapter12-19.jpg

几乎所有构造函数均产生某个副本。备份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的存取

978-7-111-51399-5-Chapter12-20.jpg

类locales的其他操作列表见表12-5。若某个类locale对象是从某个名称或若干个具名的locale构造而来的,名称将被保存起来。若参与构造的locale包含两个以上,则C++标准并未构造出的名称给予保证。若一个locale是另一个locale的副本,或两个locale名字相同,则两个locale被认为是相同的。locale的名称是被用来创建“具名facet”的名称。运用该体制,两个locale若由具体的相同名称facet参与构造,生成的新名称也相同。C++标准本质上要求“由相同名称的facet组合而成”的locale均相同,才可能精心选出支持上述“相等性”思维。

12-5 locale的操作函数

978-7-111-51399-5-Chapter12-21.jpg

小括号操作符使程序员得以运用locale对象作为字符串比较工具。此操作符运用collate facet,按顺序比较参数所传递的字符串,即在判断locale对象掌控时第一个字符串是否小于第二个字符串。这是仿函数的行为。采用locale对象作为STL算法所需的字符串排序规则。

978-7-111-51399-5-Chapter12-22.jpg

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈