2010-11-06 158 views
1

我需要重載<運算符才能使用內置類型的流。對於字符串它不是一個問題,因爲我只是重載這樣的功能:C++重載<< operator

ostream& operator<<(ostream& os, const char* str) { /*...*/ } 

這工作,因爲這個功能是全球性的,不是成員。問題是我需要爲其他基本類型(int,float等)過載運算符,但這些都是成員函數。有什麼辦法可以做到這一點?我需要它不僅適用於cout,而且適用於其他流。提前致謝。

+5

不知道你是什麼意思...''operator <<'*已經存在*用於'ostream&'和內置類型。無需超載。 'const char *'相同。 – 2010-11-06 13:49:08

+0

你的意思是,你需要有2個重載函數。一個全球和一個成員。但是,參數不同[字符串類型的全局和其他數據類型的成員函數]。對 ??? – 2010-11-06 13:52:22

+1

我知道ostream&已經有一個超載。但我必須重載它,因爲我需要它的行爲不同(不只是簡單地打印出字符)。 – Mirko 2010-11-06 14:30:29

回答

6

您不應該嘗試更改std::cout << 3;中的操作符所做的操作。它是標準API的一部分。如果您需要以某種格式輸出,流操縱不能支持,那麼例如,你可以寫一個小包裝:

struct MyFormatter { 
    MyFormatter (ostream &o) : o(o) {} 
    ostream &o; 
}; 

MyFormatter &operator<<(MyFormatter &mf, int i) { 
    mf.o << "int(" << i << ")"; // or whatever 
    return mf; 
} 

然後使用它是這樣的:

MyFormatter mf(std::cout); 
mf << 1 << "," << 2 << "," << 3; 
+0

Thx爲答案史蒂夫。你提到我不應該改變cout的<<運算符。問題是我應該這樣做。這是一個家庭作業。其任務是編寫一個基於操縱器的程序,以反轉特定標籤之間的內容。例如:cout << start <<「abc」<< end。現在「abc」字符串應該打印出「cba」。 「開始」和「結束」將是操縱者,但我仍然需要重載<<操作符才能使其工作。現在我已經用字符串成功完成了它,但是與其他初始類型有關。 – Mirko 2010-11-06 22:12:46

+1

@Mirko:我不認爲你可以嚴格地用操縱器來做到這一點。一個操縱器是一個函數(或類似函數的對象),當被寫入一個流時,該流被作爲參數調用。他們所能做的就是在流上設置狀態,'cout'只有特定的格式標誌等可供操作。我懷疑你想要的是'cout << start'返回,而不是'cout',而是一個包裝器。但是,如果沒有看到我不確定的任務,我可能錯過了一些東西。 – 2010-11-06 22:19:17

+1

無論如何,我非常確定你只是*不能*爲operator <<(ostream&,int)'提供一個重載,因爲它會與現有的重載模糊不清。 – 2010-11-06 22:25:43