2011-08-13 3 views
3

私はストリーミングについて学んでいます。なぜ出力演算子の 'os << value'ではなく 'value >> os'ですか?

ostream& operator<<(stream& os, CLASS& rc); 

なぜそれが不可能このようにそれを宣言することです:標準ストリームは、として宣言することができ<<オペレータに提供しますか?その実装の一部として

rc.something >> os; 

ostream& operator>>(CLASS& rc, stream& os); 

それから私のような何かを行うことができるかもしれません。


編集人々が私はこれについての詳細を学ぶ助けたとして、私は感謝しています。

しかし、私は実際にそれを実装する方法に固執しています。

私は

ostream& operator >> (const SomeClass& refToCls, stream& os) 
{ 
    refToCls.iVar >> os; 
    return os; 
} 

を試してみましたが、それは失敗します。どうすれば修正できますか?

+3

注意、あなたは 'クラスのconst&rc'を使用する必要があります。 –

+0

>>あなたは、あなたが>>を使っているときにも、istreamを意味しますか? –

+0

@ Martin、参加していただきありがとうございます。回答を見て、可能であれば、そのような連鎖作業を行う>>の実装を提供してください。 – Dalton

答えて

7

実際にはそれが

ostream& operator>>(CLASS& rc, ostream& os); 

を定義することが可能です。しかし、あなたはこのようにそれをチェーンする必要があります。

a >> (b >> (c >> str)); 

>>演算子は左結合なので、デフォルトでは、この:

a >> b >> c >> str; 

は、

012と同等です。
((a >> b) >> c) >> str; 

これは間違った意味を持ちます。ここで

+7

+1:確かに。それは最も確かに実行できます。それはただのばかげたことだ。 –

+0

ありがとうybungalabill、 – Dalton

+0

@Tomalak、どうしてそうですか? – Dalton

1

は、あなたが入力を収集し、その後のostreamに送信するヘルパークラスで、関連性を気にせずにそれを行うことができます方法は次のとおりです。

#include <iostream> 
#include <string> 
#include <sstream> 
#include <algorithm> 

class ReversePrinter 
{ 
    std::string acc; 
public: 
    template <class T> 
    ReversePrinter(const T& value) 
    { 
     *this >> value; 
    } 

    template <class T> 
    ReversePrinter& operator>>(const T& value) 
    { 
     std::stringstream ss; 
     ss << value; 
     acc += ss.str(); 
     return *this; 
    } 
    std::ostream& operator>>(std::ostream& os) 
    { 
     std::reverse(acc.begin(), acc.end()); 
     return os << acc; 
    } 
}; 

struct R 
{ 
    template <class T> 
    ReversePrinter operator>>(const T& value) { 
     return ReversePrinter(value); 
    } 
}; 

int main() 
{ 
    std::string name = "Ben"; 
    int age = 14; 
    const char* hobby = "reading backwards"; 
    R() >> "Hello, my name is " >> name >> "\nI'm " 
     >> age >> " years old and I like " >> hobby >> std::cout; 
} 
+0

あなたは 'acc = ss.str()+ acc;'を実行せずに 'std :: reverse'をスキップしますか?さもなければ、それはすべての言葉を後方に印刷しないでしょうか? –

関連する問題