【问题标题】:How are iomanip functions Implemented?iomanip 函数是如何实现的?
【发布时间】:2015-06-02 23:17:35
【问题描述】:

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

我想知道这是如何实现的,例如,我可以用函数做类似的事情吗?这确实是我需要 this answer 的解决方案,但我不知道该怎么做。

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

读者注意:

这个问题有an excellent answer但是对于查找这个问题的个人;此答案仅在与ios_base 提供的以下功能结合使用时才有用:

【问题讨论】:

  • 他们实际上是在使用辅助函数/类和专门的 operator<<() / operator>>() 重载。
  • 与自定义格式选项不同,流有一个width 成员函数作为访问器和修改器。据我所知,自定义添加几乎必须使用xalloc 等。人。
  • @chris 你所说的xalloc 疯狂是什么?我读了cplusplus.com'sdescription of the xalloc,但这并没有为我澄清任何事情。
  • @JonathanMee,我从未使用过它。只是在流 AFAIK 中存储任意信息的一种方式。 pword 页面有一个示例,cppreference 也是如此。
  • @chris 由于您的 cmets,我只能在这里使用答案。所以非常感谢你!我已将它们纳入问题中,旨在帮助未来的读者走上一条比挖掘 cmets 更容易的道路。

标签: c++ insertion iomanip setw extraction-operator


【解决方案1】:

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

#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&lt;&lt; 有一个重载,它把指向函数的指针 std::ostream&amp; (*fp)(std::ostream&amp;) 作为它的右手边(例如,一个操纵器)

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

【讨论】:

  • “不确定你是否只能使用一个函数” 可以。当时使用的特定函数指针有一个运算符重载。它适用于没有参数的情况。
  • @πάνταῥεῖ 我的意思是接受参数的操纵器。在这种情况下,您需要重载 std::ostream&amp; std::ostream::operator&lt;&lt;( std::ostream&amp; (*fp)(std::ostream&amp;, param1, param2... )),这是不允许的。
  • @RemyLebeau 我认为可以,至少我认为它不违反标准。这是我偶然发现的东西:stackoverflow.com/a/12182338/3093378
猜你喜欢
  • 2021-01-10
  • 1970-01-01
  • 2012-01-18
  • 2014-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-02
  • 2010-09-11
相关资源
最近更新 更多