C++IO標準庫 能否非入侵的修改<< >>操作符的行為?
比如
os &<&< int(4);我希望輸出而二進位int到流中基礎類型的輸入輸出操作符行為已經定義
標準庫是否提供了非入侵的修改該操作符的行為
你需要的是一個新的os,而不是一個新的&<&<
#include "stdafx.h"
#include &
#include &
#include &
#include &
#include &
#include &
#include &
using namespace std;
class IntStream : public ostream
{
public:
template&
explicit IntStream(std::basic_streambuf&
ostream operator&<&<(int value);
private:
};
template&
IntStream::IntStream(std::basic_streambuf&
:ostream(sb)
{
}
ostream IntStream::operator&<&<(int value)
{
*this &<&< "rewrite your int formater here " &<&< value;
return *this;
}
int _tmain(int argc, _TCHAR* argv[])
{
IntStream str(cout.rdbuf());
str &<&< int(4) &<&< endl;
return 0;
}
代碼應該不難懂,希望題主自己能看懂。
你把ostream派生一下,或者再弄個類包裝一下ostream,然後自定義operator&<&<(int)
有兩種可能的解決方案:
- 自定義一個ostream(例如CustOutputStream),繼承自ostream,重載其對int類型的&<&<操作符。這個已有多人提到了。
- 自定義一個int(例如CustInt),作為int類型的wrapper類型,重載其對ostream的&<&<操作符。類似Java的做法。
從技術上來說,二者是等效的。但是從概念上來說,你需要的不是一個特殊的ostream,而是一個特殊的int,它在被輸出到ostream的時候執行自定義的工作。所以第二種方案可能更合理。另外,第二種方案也更靈活一些,因為:
- 改動量更小,因為不需要替換所有的ostream。
- 當需要在同一個ostream上輸出int的二進位值和字面值時,第一種方案難以做到,第二種方案只需要分別傳入int和CustInt就可以了。
樓上有人提到這個解決方案:
std::ifstream f("output", std::ios::binary);
效果是將stream中的數據全部以二進位格式處理,但我假定問題是怎樣僅僅對int進行處理。當然也可以隨時傳入std::ios::binary來控制其格式,但那樣太麻煩了。話說為什麼已有的答案都這麼誤人子弟,或模稜兩可、或虛無縹緲喃。同學們回答問題的時候要有點責任心嘛。
首先題主舉例問以二進位輸出int,實際上標準庫是有這個方法的,以cout為例:
#include &
#include &
using namespace std;
int main()
{
cout &<&< bitset&<8&>(123) &<&< endl;
}
然後題主問,有無非侵入式的方式改變已定義運算符的行為。答案是沒有。實際上按語法邏輯,一個東西「已定義」,用戶再「定義」,不就是「重定義」莫;所以肯定是沒有的。
不過可以通過一個包裹層解決這個問題,就像上面的例子一樣: #include &
using namespace std;
struct int_bits
{
int_bits(int value): value(value) {}
int value;
};
ostream operator &<&< (ostream, int_bits bits) { if (int value = bits.value) { cout &<&< int_bits(value &>&> 1) &<&< (value % 2); } return cout; } int main() { cout &<&< int_bits(123) &<&< endl; }
首先os是不是二進位流...然後你可以通過更換&<&<或者&>&>左側或者右側的對象的類型再弄一個重載,比如右邊的值可以包裝一下,或者左邊的os用自己衍生出來的類
2333,你需要重載
可以寫個類來保存int的二進位,再寫個友元來輸出…但這樣為什麼不直接寫個函數來返回int的二進位再輸出呢…直接去改動ostream添加一個重載版的operator &<&<()也可以
要的是這個吧 std::ifstream f("output", std::ios::binary);
推薦閱讀:
※為什麼用C或C++表達Windows COM技術那麼複雜呢?是C或C++缺少什麼嗎~
※Qt編程可不可以結合其他的第三方庫和本土API?
※為什麼代碼中的comp函數只需返回0就可以表示兩串相同?
※如何看待微軟自己的產品不用自己的庫寫而用Qt寫?
※看完《C++ Primer》和《Effective C++》能找到一份起薪 5000 元以上的工作嗎?