可以轮询标准 C++ iostream 操纵器的状态吗?

Can the state of a standard C++ iostream manipulator be polled?

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

例如,

可能需要
std::cout << std::internal << myClassReference;

行为不同于

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

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

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

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

flags 函数有两种:const 轮询函数用 stream.flags() 调用,设置函数用 stream.flags(mynewflags) 调用。这两个函数 return fmtflags 对象的副本在调用 flags.

之前处于其状态

实现自定义操纵器集会有点困难,需要实现者首先决定他们希望如何存储和访问这些操纵器。就个人而言,我更倾向于实现另一个从 std::ios_base 继承的流对象,可能是间接的,并使用它来封装两个基本流(可能只是标准库中的一个,可能有这个新的 class在流类型上模板化)和附加的操纵器标志。其他任何事情都需要一种方法来检查外部变量中的操纵器标志,或者记住将变量传递给任何打印函数,这会阻碍使用 operator<< 进行输出。这意味着您需要创建另一个成员函数来轮询您的自定义标志,但无论如何这看起来确实很明智。