2011-08-13 86 views
3

我正在學習流媒體。標準流提供<<操作者可以聲明爲:爲什麼輸出運算符'os << value'而不是'value >> os'?

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

爲何不能將其聲明爲這個?

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

然後,我也許可以這樣做:

rc.something >> os; 

作爲其實現的一部分。


編輯的人幫助我瞭解更多關於這一點,我很感謝。

但是我堅持如何實現它。

我已經試過

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

,但它失敗。我該如何解決它?

+3

注意,你應該使用'CLASS常量與rc'。 –

+0

你也指istream在使用時>>不是嗎? –

+0

@Martin,感謝您的加入,請看這個答案,併爲我提供一個實現>>,使得這種鏈接工作,如果可能的話。 – Dalton

回答

7

事實上,它是可能的定義

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

但你必須鏈這樣的:

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

>>運算符是左結合的,所以默認此:

a >> b >> c >> str; 

相當於:

((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'?否則,它不會將所有單詞向後打印出來嗎? –

相關問題