3

我正在通过从std::codecvt. 我应该实现的大多数方法都非常简单,除了 this std::mbstate_t。在我的编译器 vs2010 上,它被声明为int. 但是,谷歌告诉我它是一种 POD 类型,它有时是一个联合(我不知道的)或一个结构(我再次找不到它)。

据我了解,std::mbstate_t是部分转换的占位符。而且,我认为,当需要更多空间来编写输出时,它就会发挥作用,std::codecvt::on_out()而输出又会调用std::codecvt::do_unshift(). 如果我的假设是错误的,请纠正我。

我读过另一篇关于存储指针的文章,尽管这篇文章没有足够的答案。我也读过这个例子,它假定它是 32 位类型,尽管标准规定int不小于 16 位。

我的问题。我可以在 std::mbstate_t 中安全地存储什么?我可以安全地用另一种类型替换它吗?上述帖子的答案建议替换它,但以下评论另有说明。

4

1 回答 1

3

我认为 /the/ 有关这些东西的书是 Langer 和 Kreft 的 C++ IOStreams and Locales,如果你真的想弄乱这些东西,请尝试获取一份副本。现在,回到您的问题,mbstate_t用于保存转换状态。通常,您会将其存储在转换方面,但由于方面是不可变的,因此您需要将其存储在外部。实际上,当您需要多个字节序列来确定相应的字符时,就会使用它,Linux 联机帮助页mbsinit()提供了 ISO-2022 和 UTF-7 作为此类编码的示例。请注意,这不会影响 UTF-8,其中单个 Unicode 代码点始终由字节序列编码,并且在此之前或之后没有任何影响结果的内容。部分 UTF-8 序列也不由它处理,do_in()partial而是返回。

现在,您可以在 中存储什么mbstate_t?由于实际类型是未定义的,并且操作它的函数数量非常有限,所以一开始你无能为力。但是,该状态也没有其他任何作用,因此您可以对其进行一些丑陋的黑客攻击。根据标准库,这可能需要一些#ifdef,但是您可以简单地(ab)使用它是 POD(整数和联合也是 POD)这一事实来存储几乎任何类型的不更大的 POD。这不会为您赢得美丽的价格,并且代码不会自动在任何系统上运行,但我认为在这种情况下这是不可避免的,并且移植工作也受到限制。

最后,能换吗?这种类型是其中的一部分,std::char_traits反过来会影响所有字符串和流,因此您需要在整个程序中替换它们或转换它们。此外,如果您现在创建一个新char_traits类,您仍然不能轻松地实例化basic_string它,因为不能保证通用的 basic_string 模板甚至存在,只需要 and 的两个特化charwchar_t以及 C 的更多特化) ++11) 存在。同上流。简而言之,不,你不能替换 mbstate_t。

于 2013-07-09T05:26:32.777 回答