1

在为 iostream << 运算符编写重载时,尤其是在应用程序类上,可能需要根据对该流对象有效的标准操纵器来更改该重载的行为。可以从 << 重载的实现中轮询流的标准操纵器的状态吗?

例如,它可能是可取的

std::cout << std::internal << myClassReference;

表现得不同于

std::cout << std::left << myClassReference;

除了差异之外,<< 的自定义重载可能会在其实现中移交给成员 <<'s。

如果可以轮询 iostream 的操纵器状态,这是如何实现的?另外,实现自定义操纵器的人应该怎么做才能同样轮询其操纵器的状态?

4

1 回答 1

2

可以使用类的flags()函数来轮询 c++ 流的格式化状态std::ios_base,所有 c++ 流都从该函数继承。

flags函数有两种类型:调用函数的const轮询函数stream.flags()和调用函数的设置函数stream.flags(mynewflags)。这两个函数都返回fmtflags对象在调用之前的状态的副本flags


实现自定义操纵器集会有点困难,并且需要实施者首先决定他们希望如何存储和访问这些操纵器。就个人而言,我更倾向于实现另一个流对象std::ios_base,它可能间接地继承自操纵器标志。其他任何事情都需要一种方法来检查外部变量中的操纵器标志,或者记住将变量与任何打印函数一起传递,这会阻碍operator<<用于输出的使用。这意味着您需要创建另一个成员函数来轮询您的自定义标志,但无论如何这看起来确实很明智。

于 2015-11-23T20:03:54.403 回答