いくつかの異常な演算子をオーバーロードすると、かなりうまく機能します。以下では、 <=をオーバーロードすることを選択しました。これは、左から右への結合性が<<と同じであり、ルック アンド フィールがどういうわけか似ているためです ...
#include <iostream>
#include <stdint.h>
#include <arpa/inet.h>
using namespace std;
ostream & operator<= (ostream& cout, string const& s) {
return cout.write (s.c_str(), s.size());
}
ostream & operator<= (ostream& cout, const char *s) {
return cout << s;
}
ostream & operator<= (ostream&, int16_t const& i) {
return cout.write ((const char *)&i, 2);
}
ostream & operator<= (ostream&, int32_t const& i) {
return cout.write ((const char *)&i, 4);
}
ostream & operator<= (ostream&, uint16_t const& i) {
return cout.write ((const char *)&i, 2);
}
ostream & operator<= (ostream&, uint32_t const& i) {
return cout.write ((const char *)&i, 4);
}
int main() {
string s("some binary data follow : ");
cout <= s <= " (machine ordered) : " <= (uint32_t)0x31323334 <= "\n"
<= s <= " (network ordered) : " <= htonl(0x31323334) ;
cout << endl;
return 0;
}
いくつかの欠点があります。
<=の新しい意味は、読者を混乱させたり、予期しない結果につながる可能性があります。
cout <= 31 <= 32;
と同じ結果は得られません
cout <= (31 <= 32);
上記の例に示されているように、エンディアンはコードを読むときに明確に言及されていません。
同じ優先順位のグループに属していないため、単純に<<と混在させることはできません。私は通常、括弧を使用して次のように明確にします。
( cout <= htonl(a) <= htonl(b) ) << endl;