9

一部の標準iomanip関数はパラメーターを受け取ります。

これがどのように達成されるか知りたいのですが、たとえば、関数で同様のことを行うことはできますか? それが本当にこの回答に必要な解決策ですが、これを行う方法がわかりませんでした。

setwたとえばhttp://en.cppreference.comで関数の定義を調べたところ、戻り値の型が「未指定」としてリストされており、パラメーターを取るのではなく、1 つの引数しかリストされていませんstream&。これはどのように作動しますか?

読者への注意:

この質問には優れた回答がありますが、この質問を調べている個人にとっては。この回答は、によって提供される次の機能と組み合わせた場合にのみ役立ちますios_base

4

1 に答える 1

10

以下は、クラスを使用して定義された 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<<は、関数へのポインタをstd::ostream& (*fp)(std::ostream&)右側として受け取るオーバーロードがあるためです (マニピュレータなど)。

PS: N. Josuttis によるC++ 標準ライブラリは、マニピュレータ/カスタム マニピュレータがどのように機能するかを詳細に説明しています。15.6.3ユーザー定義マニピュレータ

于 2015-03-30T03:24:56.040 に答える