2011-01-11 8 views
2

誰も私にsetwマニピュレータの宣言を説明できますか?私はそれを理解しようとして完全に吹き飛ばされました! iomanipでのsetwの宣言は次の通りですなぜcoutはsmanipを返しますか?

smanip setw(int) 

今smanipとは何ですか?私たちははstd :: coutのに< < setwを与えたときに何が起こる(10)< <「ハイ」[私は他の言葉で行動が

答えて

4

smanipは、実装定義のタイプです。ライブラリは、仕事が終わる限り、好きなものを定義したり、typedefすることができます。

実際には、(a)実行される操作、および(b)この操作で使用される引数10を表す何らかの構造になります。また、実装がoperator<<(ostream &, smanip)を定義した方法、または必要なオペランドタイプをキャッチするための類似のオーバーロードに応じて、操作を実行する機能を持つこともあれば、機能しないこともあります。私は自分の実装をチェックしていない。

出力がどのように影響を受けるかについては、my_stream << setw(10)は、ストリームに対して、my_stream.width(10)と同じ効果を持つように定義されています。したがって、operator<<のオーバーロードは、実装固有の方法で発生することを保証します。パラメータ化されていないストリームマニピュレータのオペレータオーバーロードは、特にマニピュレータを呼び出すように定義されていますが、smanipでは実装が少し自由になります。

+0

void Function1 {std :: cout.width(10); std :: cout.fill( '*'); } int main(){Function1();} std :: cout << "hai"; return 0;}上のスニペットから、マニピュレータには機能スコープがあることがわかります!実装固有のものですか? –

+0

@ Karthik:マニピュレータの効果には語彙の範囲がありません。ストリームオブジェクトに移動すると、ストリームオブジェクトが変更され、設定がリセットされるまでストリームオブジェクト内に保持されます。あなたのコードは '******* hai'を出力するはずですが、実装固有のものではないと思います。 –

0

setw(int)による)ボンネットの下に起こって、出力が実際setwによってどのように影響されるかを知りたいですそれ自体は何も変更しません。ストリームの動作を変更するために使用できるストリームマニピュレータ(smanip)を返します。

// setw example 
#include <iostream> 
#include <iomanip> 
using namespace std; 

int main() { 
    cout << setw (10); 
    cout << 77 << endl; 
    return 0; 
} 
+0

はい、それはどのように影響するか知っていますか?言い換えれば、smanipはテンプレート化されたクラスのようですが、デカールはsmanip setw(int)です。それはsmanipでなければならない setw(int)なんかそんなこと? –

関連する問題