2011-10-29 19 views
0

私は良いC++の本を持っていません。一般的な印刷機能

これはどのように機能しますか?概念的にここで何が起こっているのですか?技術的には、オペレータのプロトタイプは< <()があらかじめ定義されていますが、これはどのように書き込むのですか?< <は出力コンテナの値にオーバーロードされますか?

私はoperator<<()を見て、それをオーバーロードすることができますか?

また入力には開始と終了の "place"が必要ですc.begin()c.end() ...しかし出力のためには "place"が1つ必要ですostream_iterator。これは少し非対称のようです。

template <typename Container> 
std::ostream& operator<<(std::ostream& os, const Container& c) 
{ 
    std::copy(c.begin(), c.end(), 
       std::ostream_iterator<typename Container::value_type>(os, " ")); 
    return os; 
} 
+0

さまざまな演算子に使用できるプロトタイプを意味しますか?見て[ここ](http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B)。 –

+0

私はこれを[オペレータがFAQ項目をオーバーロードする](http://stackoverflow.com/questions/4421706/operator-overloading)の欺瞞としてクローズすることに投票しましたが、これは疑問ですオペレータのオーバーロードがどのように機能するかだけではありません。よく分かりません。 – sbi

+0

これは常に同じ演算子で、異なる型、特に 'std :: ostream&'(または別の型のストリーム)を左のオペランドとしてオーバーロードするだけです。この場合、チェーンを許可するためにオペレーターに渡された同じストリームへの参照を戻すように注意する必要があります。 –

答えて

1

これはかなり曖昧ですが、私はそれに打撃を与えるだろう:

技術を、オペレータ< <()の定義済みのプロトタイプで、どのようにこれのライターが書く方法を知っていました< <がコンテナ値を出力するためにオーバーロードされるようにしますか?

オペレータ< <()を見て、私はそれをオーバーロードできますか?

演算子は、オーバーロードされていないすべてのユーザー定義型に対してオーバーロードできます。これに関する詳細は、hereを参照してください。

入力の場合は、開始位置と終了位置 "place" c.begin()、c.end()...が必要ですが、出力には "place" ostream_iteratorが1つ必要です。これは少し非対称のようです。質問としてこれを取る

... std::copy()が定義されているだけの方法です
:それは(開始と終了の反復子によって定義された)入力範囲、および書き込みをする場所のための出力イテレータを取ります。どこに書いても、十分な余裕があると仮定しています。 (出力ストリーム演算子を使用する場合は、十分な余裕があります)

自分自身を取得したい場合がありますa good C++ book

+0

2番目の部分は注目に値します –

+0

SFINAEとは何ですか? –

+0

@は、 "C"を開始する場所に "copy A-> B"を移動するのはかなり普通です。 ChrisAaker:http://tinyurl.com/5wtwc5c – sbi

関連する問題