標籤:

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&* sb);
ostream operator&<&<(int value); private: }; template&
IntStream::IntStream(std::basic_streambuf&* sb)
: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)


有兩種可能的解決方案:

  1. 自定義一個ostream(例如CustOutputStream),繼承自ostream,重載其對int類型的&<&<操作符。這個已有多人提到了。

  2. 自定義一個int(例如CustInt),作為int類型的wrapper類型,重載其對ostream的&<&<操作符。類似Java的做法。

從技術上來說,二者是等效的。但是從概念上來說,你需要的不是一個特殊的ostream,而是一個特殊的int,它在被輸出到ostream的時候執行自定義的工作。所以第二種方案可能更合理。另外,第二種方案也更靈活一些,因為:

  1. 改動量更小,因為不需要替換所有的ostream。

  2. 當需要在同一個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 元以上的工作嗎?

TAG:C | 標準庫 | C11 |