39.2 类locale

类local及其相关特性都在<locale>中。

如果一个给定名字的locale或facet所指向的locale并不存在,则用此名访问locale的操作会抛出一个runtime_error。

locale的命名机制有些奇怪。当你用一个locale和一个facet创建一个新locale时,若结果locale有名字,则此名是由具体C++实现定义的。通常,这个名字包含贡献了最多facet的locale的名字。对于无名locale,name()返回"*"。

我们可以将一个locale看作一个map<id,facet*>的接口,即,它允许我们用一个locale::id查找对应的locale::facet派生类对象。locale的实际实现是这一思想的一种高效变体,其内存布局可能像下面这样:

上图中的collate<char>和numpunct<char>都是标准库facet(见39.4节),所有facet都派生自locale::facet。

locale可以自由、高效地拷贝。因此,locale几乎必然实现为一个特例化map<id,facet*>的句柄,这构成了实现的主体。locale中的facet必须能快速访问,因此,特例化的map<id,facet*>必须进行类似数组的快速访问优化。我们可以用use_facet<Facet>(loc)语法访问locale中的facet;见39.3.1节。 ...

Get C++程序设计语言(第4部分:标准库)(原书第4版) now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.