12.3.5  刻面的处理

12.3.5 刻面的处理

由于locale对象的facet提供用于本地化软件的服务,因此需要一种访问和使用该服务的方法。提供重要支持的模板函数包括两个:has_facet和use_facet。在给定的区域表示中存在指明的刻面,模板has_facet函数返回true值。例如,若判断德语区域表示是否支持ctype facet,可编写以下代码:

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

每种类型的facet均定义了函数,程序可以调用函数处理表示所用数据。通常使用use_facet调用facet对象的成员函数。假定需要调用ctype类型刻面的toupper()函数,在德语区域表示规则把字符串转化成大写形式。例如,

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

此处的std::has_facet和std::use_facet的调用某些实际参数的使用方法,在此之前并未出现。

模板函数has_facet的使用方法如下:

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

参数Loc是现存facet的locale对象。如果locale类的对象具有被测试过的刻面,函数返回值为true;否则,将返回false。

说明

模板函数是非常有用的,尤其在一个locale中,检查非强制的facet是否被列出。在模板函数use_facet()被调用之前,避免抛出异常。模板函数use_facet的使用方法:

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

参数_Loc是locale类型的常量,包含被引用的facet类型。函数返回值是参数_Loc的引用。函数使用说明:只要保留的任一版本locale存在,通过模板函数返回的刻面引用保留了有效性。如果没有这样的facet对象被列出在参数locale中,函数会抛出一个bad_cast类型的异常。

例12-5

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

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

例12-5的执行结果为:

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