我需要重載<運算符才能使用內置類型的流。對於字符串它不是一個問題,因爲我只是重載這樣的功能:C++重載<< operator
ostream& operator<<(ostream& os, const char* str) { /*...*/ }
這工作,因爲這個功能是全球性的,不是成員。問題是我需要爲其他基本類型(int,float等)過載運算符,但這些都是成員函數。有什麼辦法可以做到這一點?我需要它不僅適用於cout,而且適用於其他流。提前致謝。
我需要重載<運算符才能使用內置類型的流。對於字符串它不是一個問題,因爲我只是重載這樣的功能:C++重載<< operator
ostream& operator<<(ostream& os, const char* str) { /*...*/ }
這工作,因爲這個功能是全球性的,不是成員。問題是我需要爲其他基本類型(int,float等)過載運算符,但這些都是成員函數。有什麼辦法可以做到這一點?我需要它不僅適用於cout,而且適用於其他流。提前致謝。
您不應該嘗試更改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;
Thx爲答案史蒂夫。你提到我不應該改變cout的<<運算符。問題是我應該這樣做。這是一個家庭作業。其任務是編寫一個基於操縱器的程序,以反轉特定標籤之間的內容。例如:cout << start <<「abc」<< end。現在「abc」字符串應該打印出「cba」。 「開始」和「結束」將是操縱者,但我仍然需要重載<<操作符才能使其工作。現在我已經用字符串成功完成了它,但是與其他初始類型有關。 – Mirko 2010-11-06 22:12:46
@Mirko:我不認爲你可以嚴格地用操縱器來做到這一點。一個操縱器是一個函數(或類似函數的對象),當被寫入一個流時,該流被作爲參數調用。他們所能做的就是在流上設置狀態,'cout'只有特定的格式標誌等可供操作。我懷疑你想要的是'cout << start'返回,而不是'cout',而是一個包裝器。但是,如果沒有看到我不確定的任務,我可能錯過了一些東西。 – 2010-11-06 22:19:17
無論如何,我非常確定你只是*不能*爲operator <<(ostream&,int)'提供一個重載,因爲它會與現有的重載模糊不清。 – 2010-11-06 22:25:43
在C++中,運算符重載要求至少有一個「類類型」或枚舉類型的操作數。
重點是你是而不是允許超載運算符的原始類型。
http://www.parashift.com/c++-faq-lite/intrinsic-types.html#faq-26.10
不知道你是什麼意思...''operator <<'*已經存在*用於'ostream&'和內置類型。無需超載。 'const char *'相同。 – 2010-11-06 13:49:08
你的意思是,你需要有2個重載函數。一個全球和一個成員。但是,參數不同[字符串類型的全局和其他數據類型的成員函數]。對 ??? – 2010-11-06 13:52:22
我知道ostream&已經有一個超載。但我必須重載它,因爲我需要它的行爲不同(不只是簡單地打印出字符)。 – Mirko 2010-11-06 14:30:29