首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么时候应该使用派生类面来代替基类面?

什么时候应该使用派生类面来代替基类面?
EN

Stack Overflow用户
提问于 2013-07-24 01:23:18
回答 1查看 130关注 0票数 0

C++标准库中有几个标准基类方面,其默认行为依赖于经典的"C“区域设置(std::locale::classic())。这将使您有理由切换到派生类方面(也称为byname方面),如果您的程序需要特定于文化的功能,其行为取决于其构造时指定的区域设置。

例如,std::ctype提供了经典的"C“字符分类:

§22.4.1.3.3 静态掩码* classic_table() noexcept除外; 返回:指向大小为table_size的数组的初始元素的指针,该数组表示"C“区域设置中字符的分类

这是否意味着std::ctype的行为在功能上与安装它的地区的行为不同?例如,假设我有一个日本地区:

代码语言:javascript
复制
std::locale loc("ja_JP");

我想用一个面对日本字进行字符分类。字符分类是std::ctype的用途:

代码语言:javascript
复制
auto& f = std::use_facet<std::ctype<char>>(loc);

fctype方法会根据日本的语言环境,还是经典的"C“语言来对字符进行分类?我的第一个猜测是基于上述标准引文的"C”语言环境,但实际上它是日本语言环境。我想知道为什么这个引用与这里发生的情况不一致。

以下是我的问题:

  • 为什么标准说ctype执行"C“字符分类,而ctype实际上是根据使用它的地区进行分类的?

  • 既然以上是正确的,派生类方面从何而来?当基类已经使用我想要的区域设置时,为什么要使用派生类facet呢?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-24 01:27:24

只有default-constructed std::ctype<char> facet使用classic_table进行分类。从系统提供的"ja_JP"获得的方面不是这方面的一个例子。

在讨论派生方面时,人们通常指的是从std::ctype等派生的用户定义的方面,而不是系统提供的byname方面。如果要重新定义某个字符类,可以使用派生的ctype方面,例如,处理逗号空白以解析逗号分隔的输入流,或停止将空格和制表符视为空白,逐行解析流。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17823693

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档