39.3 类facet
一个locale就是一个facet集合。一个facet表示一个特定的文化侧面,例如数值输出时如何表示(num_put),如何从输入读取日期(time_get)以及在文件中如何保存字符(codecvt)。39.4节列出了标准库facet。
用户可以定义新的facet,例如确定季节名如何打印的facet(见39.3.2节)。
facet在程序中表示为std::locale::facet派生类的对象。类似其他locale特性,facet也定义在<locale>中:
类facet设计为无公有函数的基类。其构造函数是protected的,以防止创建“普通facet”对象,其析构函数是virtual的,以确保派生类对象正确销毁。
facet一般通过保存在locale中的指针来管理。传递给facet构造函数一个参数0表示locale应在facet的最后一个引用释放后删除它。反之,非零参数确保locale永远也不会删除facet。在极少数情况下,facet的生命期由程序员直接控制而不是通过locale间接控制,此时非零参数就很有意义了。
每种facet接口都必须有独立的id:
用户使用id为每个提供新facet接口的类定义一个id类型的static成员(例如,见39.4.1节)。locale机制用id标识facet(见39.2节和39.3.1节)。在显而易见的locale实现中,id用作facet指针向量的索引,从而实现高效的map<id,facet*>。 ...
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.