9

一些标准iomanip函数需要一个参数。

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

例如,当我在http://en.cppreference.com中查找setw函数的定义时,它会将返回类型列为“未指定”,并且它也只列出了一个参数,而不是带一个参数。这是如何运作的?stream&

读者注意:

这个问题有一个很好的答案,但是对于查找这个问题的个人来说;此答案仅在与以下提供的功能结合使用时才有用ios_base

4

1 回答 1

10

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

#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++ 标准库详细描述了操纵器/自定义操纵器的工作原理,请参阅第 2 节。15.6.3用户定义的操纵器

于 2015-03-30T03:24:56.040 回答