以下は、クラスを使用して定義された 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ユーザー定義マニピュレータ