iomanip函数是如何实现的

How are iomanip functions Implemented?

本文关键字:实现 何实现 函数 iomanip      更新时间:2023-10-16

一些标准的iomanip函数接受一个参数。

我想知道这是如何实现的,例如,我可以用一个函数做类似的事情吗?这确实是我需要的答案,但我不知道如何做到这一点。

例如,当我在中查找setw函数的定义时http://en.cppreference.com它将返回类型列为"0";未指定";,并且它也只列出一个参数,而不是同时采用stream&参数。这是怎么回事?

读者注意:

这个问题有一个很好的答案,但对于查找这个问题的个人来说;这个答案只有与ios_base提供的以下功能相结合才有用:

  • xalloc
  • iword
  • pword

下面是一个用户定义的操纵器的简单示例,该操纵器采用一个使用类定义的参数:

#include <iostream>
class putX // injects some `X`s into the stream
{
    std::size_t _n;
public:
    explicit putX(std::size_t n): _n(n) {}
    std::size_t getn() const {return _n;}
    friend std::ostream& operator<<(std::ostream& os, const putX& obj)
    {
        std::size_t n = obj.getn();
        for (std::size_t i = 0; i < n; ++i)
            os << 'X';
        return os;
    }
};
int main()
{
    std::cout << putX(10) << " test " << putX(10);
}

不带参数的机械手可以简单地实现为

std::ostream& custom_manip(std::ostream& os) { // do something with os and return os;}

这是因为basic_ostream::operator<<有一个过载,它将指向函数std::ostream& (*fp)(std::ostream&)的指针作为其右手侧(例如,操纵器)

PS:N.Josuttis的C++标准库详细描述了操纵器/自定义操纵器的工作方式,请参见第15.6.3节用户定义操纵器