la surcharge de certaines des opérateurs fonctionne plutôt bien. Voici ci-dessous, j'ai choisi de surcharge <= , car il a la même de gauche à droite associativité comme << et a en quelque sorte un regard de près et sentir ...
#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;
}
Il y a plusieurs inconvénients :
-
le nouveau sens de l' <= peut confondre les lecteurs ou conduire à des résultats inattendus :
cout <= 31 <= 32;
on ne donnera pas le même résultat que
cout <= (31 <= 32);
l'endianess n'est pas clairement mentionné lors de la lecture du code, comme
illustré dans l'exemple ci-dessus.
-
il est impossible de mélanger tout simplement avec << parce qu'il n'appartient pas à la
même groupe de préséance. J'ai l'habitude d'utiliser des parenthèses pour préciser ces
comme :
( cout <= htonl(a) <= htonl(b) ) << endl;