以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 ZYY`f/qi
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 .WeSU0XG
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 Q@p'nE,
象当作char数组来处理。 p v4#`.m
template<class Container> 7E*0;sA#
class bit_iterator : public std::iterator<bidirectional_iterator_tag, dJzaP
void, void> E*R-Dno_F
{ /0`Eux\
public: nYC.zc*o x
explicit bit_iterator(Container& c) : m_container(&c) Z$i?p;HnW
{ n=f?Q=h\3
m_size = 8*sizeof(Container); "4KyJ;RA*
m_index = 0; Na]ITCVR
} V6>{k_0{V
explicit bit_iterator() : m_container(0) `?^<r%*F.
{ zgS)j9q}
m_size = 8*sizeof(Container); ys)
m_index = m_size; 8/B8yY-O
} qi^kf
bool operator* () +
S5uxO
{ Tq^B>{S"
char mask = 1; (^T}6t3+4
char* pc = (char*)m_container; ZCK#=:ln
int i = (m_size-m_index-1)/8; ^-Ks_4
int off = (m_size-m_index-1)%8; &~<i"
W
mask <<=off; P;7[5HFF
return pc & mask; od@!WjcM[8
} R0w~ Z
bit_iterator<Container>& operator++() aA%x9\Y
{ ?y%Mm09
m_index++; 8u*Q^-fpo0
return *this; J>hjIN
} H>\lE2
bit_iterator<Container>& operator++(int) }If,O
{ $/u.F;
m_index++; 6QHUBm2
return *this; M"-53|#:w\
} #p{8
bool operator==(bit_iterator<Container>& bitIt) ?t;,Nk`jx
{ "SKv'*\b
return m_index == bitIt.m_index; !!6@r|.
} `^g-2~
bool operator!=(bit_iterator<Container>& bitIt) 0p,_?3nX
{ O|v8.3[cT
return !(*this == bitIt); t }K8{
V
} pNHL &H\
protected: G]-\$>5R
Container* m_container; .F/l$4CQ
private: ieO w&
int m_size; FIJ]`
int m_index; (h&=Na~
}; }PMlG
Qc Xw -
用该迭代器可以将任意类型对象以二进制格式输出: R{B5{~m>W@
double a = 10; !bW^G}
<t
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));