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

标签 c++ iostream manipulators

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

例如,它可能适合

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

行为不同于

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

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

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

最佳答案

可以使用 flags() 轮询 c++ 流的格式化状态。 std::ios_base 的功能类,所有 C++ 流都继承自该类。

flags函数有两种:一个 conststream.flags() 调用的轮询函数, 和一个用 stream.flags(mynewflags) 调用的设置函数.这两个函数都返回 fmtflags 的拷贝对象在调用 flags 之前的状态.


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

关于c++ - 可以轮询标准 C++ iostream 操纵器的状态吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33879572/

相关文章:

c++ - 使用 OpenCV 和 C++ 在 Keypress 上截取网络摄像头画面

c++ - 我可以在 C++ 中覆盖非虚函数吗

c++ - 为什么空 streambuf 的流插入失败?

c++ - 在使用 cout 时如何创建一个操作文本的类?

c++ - 为什么 std::uppercase 不适用于字符串?

c++ - 在 Qt 中拖放多个对象

c++ - 将 ostream::opfx/osfx 从 Unix 移植到 Linux

iostream 运算符重载的 C++ 异常规范

带参数的 C++ 操纵器

c++ - * 对那个类有什么作用?