C ++标准库中有一些标准基类构面,其默认行为取决于经典的“ C”语言环境(std::locale::classic())。如果您的程序需要特定于文化的功能,则可以合理地切换到其行为取决于构造时指定的语言环境的派生类构面(aka 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);


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

这是我的问题:


当ctype根据使用它的语言环境实际分类时,为什么标准说ctype执行“ C”字符分类?
既然以上所述是正确的,派生类方面将进入哪里?当基类已经使用了我想要的语言环境时,为什么要使用派生类构面?

最佳答案

只有默认构造的std::ctype<char>构面使用classic_table进行分类。从系统提供的"ja_JP"获得的构面不是该示例。

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

关于c++ - 什么时候应该使用派生类构面来代替基类构面?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17823693/

10-12 03:49