gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 07:30:34 26 4
gpt4 key购买 nike

C++ 标准库中有一些标准基类方面,其默认行为依赖于经典的“C”语言环境 (std::locale::classic())。如果您的程序需要特定于文化的功能,那么切换到派生类方面(又名 byname 方面)是合理的,其行为取决于在其构造时指定的语言环境。

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

§22.4.1.3.3

   static const mask* classic_table() noexcept;

Returns: A pointer to the initial element of an array of size table_size which represents the classifications of characters in the "C" locale

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

std::locale loc("ja_JP");

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

auto& f = std::use_facet<std::ctype<char>>(loc);

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

这是我的问题:

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

  • 既然上述是正确的,那么派生类方面从何而来?当基类已经使用我想要的语言环境时,为什么还要使用派生类方面?

最佳答案

只有默认构造 std::ctype<char>方面使用 classic_table对其分类。系统提供的切面"ja_JP"不是这样的例子。

当谈到派生切面时,人们通常指的是派生自std::ctype 等的用户定义切面,而不是系统提供的byname。方面。您可以使用派生的 ctype facet 如果您想重新定义一些字符类,例如,将逗号视为空格以解析以逗号分隔的输入流,或停止将空格和制表符视为空格以逐行解析流。

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com