2

C ++標準は、マニピュレータまたは一般的なマニピュレータの認識をどのように定義しますか?

例えば:

using namespace std;
ostream& hello_manip(ostream& os){
  os<<"Hello there, fine fellow!"; return os;
}
int main(){
  cout<<hello_manip;
} 

コードcout<<hello_manipは、operator <<(cout、hello_manip)またはcout.operator <<(hello_manip)に変換されるように見えますが、代わりにhello_manip(cout)の形式を取ります。

4

1 に答える 1

8

operator<<関数ポインタを受け入れて呼び出すオーバーロードがあります。魔法は関係ありません。

あなたのような単純なマニピュレータの処理は、標準のセクション27.7.3.6.3で説明されています。

basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>& (*pf) basic_ostream<charT,traits>&))

  1. 効果:なし。フォーマットされた出力関数として動作しません(27.7.3.6.1で説明されています)。
  2. 戻り値:pf(*this)

basic_ostream<charT,traits>& operator<<(basic_ios<charT,traits>& (*pf) basic_ios<charT,traits>&))

  1. 効果:呼び出しpf(*this)。このインサーターは、フォーマットされた出力関数としては動作しません(27.7.3.6.1で説明されています)。
  2. 戻り値:*this

basic_ostream<charT,traits>& operator<<(ios_base& (*pf)(ios_base&))

  1. 効果:呼び出しpf(*this)。このインサーターは、フォーマットされた出力関数としては動作しません(27.7.3.6.1で説明されています)。
  2. 戻り値:*this

より複雑なマニピュレータ(パラメータを受け入れて状態を保持する)は、独自のoperator<<オーバーロードを持つファンクタオブジェクトを返すことによって実装されます。

于 2012-06-01T21:11:05.450 に答える