什么时候应该使用派生类方面来代替基类方面
When should I use a derived class facet in lieu of a base class facet?
在C++标准库中有一些标准基类方面,它们的默认行为依赖于经典的"C";语言环境(std::locale::classic()
)。这将使切换到派生类方面(也称为byname
方面)变得合理,如果您的程序需要特定于文化的功能,则派生类方面的行为取决于在构建时指定的区域设置。
例如,std::ctype
提供了经典的";C";字符分类:
§22.4.1.3.3
static const mask* classic_table() noexcept;
返回:指向大小为
table_size
的数组的初始元素的指针,该数组表示";C";区域
这是否意味着std::ctype
的行为在功能上与安装它的区域设置不同?例如,假设我有一个日语区域设置:
std::locale loc("ja_JP");
我想使用一个对日语字符进行字符分类的方面。字符分类是std::ctype
的作用:
auto& f = std::use_facet<std::ctype<char>>(loc);
f
的ctype
方法会根据日本语言环境对字符进行分类吗;C";一我的第一个猜测是";C";语言环境基于上面的标准引号,但实际上它是日语语言环境。我想知道为什么这句话与这里发生的事情不一致。
以下是我的问题:
为什么标准说CCD_;C";字符分类ctype实际上是根据使用它的语言环境进行分类的?
既然以上是真的,那么派生类方面在哪里呢?当基类已经使用了我想要的区域设置时,为什么要使用派生类方面?
只有默认构造的std::ctype<char>
方面使用classic_table
进行分类。从系统提供的CCD_ 12获得的方面不是其示例。
当谈到派生facet时,人们通常指的是从std::ctype等派生的用户定义facet,而不是系统提供的byname
facet。如果您想重新定义某个字符类,例如,将逗号视为空白以解析逗号分隔的输入流,或者停止将空格和制表符视为空白来逐行解析流,则可以使用派生的ctype
方面。
- std::具有相同基类的类的变体
- 是否可以初始化不可复制类型的成员变量(或基类)
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 基类中的函数名称解析
- C++初始化基类
- 如何通过派生类函数更改基类中的向量
- 如何定义一个纯抽象基类
- 如何使用基类指针引用派生类成员
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 使用基类指针创建对象时,缺少派生类析构函数
- 如何引用基类的派生类?
- 如果基类包含双指针成员,则派生类的构造函数
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 为什么此派生对象无法访问基类的后递减方法?
- 公开最直接的基类模板名称
- 当基类是依赖类型时,这是一个缺陷吗
- 如何使基类的运算符对基类的可变参数数可见(请参阅下面的代码)?
- 模板基类中的静态变量
- C++ 继承:将子类传递给需要基类的函数并获取子类行为
- 什么时候应该使用派生类方面来代替基类方面