我什么时候应该使用派生类facet代替基类facet?

时间:2013-07-24 01:23:19

标签: c++ locale

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的{​​{1}}方法会根据日语区域设置或经典的“C”方法对字符进行分类吗?我的第一个猜测是基于上面标准引用的“C”语言环境,但事实上它是日语语言环境。我想知道为什么引用不同意这里发生的事情。

以下是我的问题:

  • 为什么当ctype根据使用它的语言环境实际分类时,标准会说ctype执行“C”字符分类?

  • 由于上述情况属实,派生类方面在哪里进来?当基类已经使用我想要的语言环境时,为什么要使用派生类facet?

1 个答案:

答案 0 :(得分:1)

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

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