以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 @VFg XN
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 GS@ wG
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 pQD8#y)` C
象当作char数组来处理。 WD]dt!V%
template<class Container> #'T@mA
class bit_iterator : public std::iterator<bidirectional_iterator_tag, 8dfx _kY`/
void, void> 3:RZ@~u=
{ iC">F.9#
public: oc.x1<Nd
explicit bit_iterator(Container& c) : m_container(&c) (RF6K6~
{ ;(A'XA4
6N
m_size = 8*sizeof(Container); 4e4$AB "
m_index = 0; eZHi6v)i
} =Ur/v'm
explicit bit_iterator() : m_container(0) fO+;%B
{ va)\uXW.N
m_size = 8*sizeof(Container); ~2H)#`\ac8
m_index = m_size; Cv3H%g+as
} ZtiOf}@i\
bool operator* () &E~7ty'
{ &fWZ%C7|jC
char mask = 1; 71eD~fNdx
char* pc = (char*)m_container; 8G=4{,(A
int i = (m_size-m_index-1)/8; `YJ`?p
int off = (m_size-m_index-1)%8; );C !:?
mask <<=off; b^ZrevM
return pc & mask; :&]%E/
} :
f Wh7X3
bit_iterator<Container>& operator++() yl*S|= 8;k
{ U i;o/Z3
m_index++; `S2=LJ
return *this; -$*YN{D+
} }x+{=%~N
bit_iterator<Container>& operator++(int) 9r!%PjNvE
{ `8Gwf;P1
m_index++; LY"/ Q
return *this; [}Nfs3IlBw
} GlaWBF#
bool operator==(bit_iterator<Container>& bitIt) '#XP:nqFkK
{ X~x]VKr/
return m_index == bitIt.m_index; tC&Xm}:
} b`IC)xN$
bool operator!=(bit_iterator<Container>& bitIt) SYyH_0N
{ rv^j&X+EH
return !(*this == bitIt); f-#fi7
} v{I:Wxe
protected: dW91nTQ:
Container* m_container; [KJm&\evp
private: OLv(
int m_size; edm&,ph]
int m_index; =,sMOJc>
}; {It4=I)M
?x:\RNB/
用该迭代器可以将任意类型对象以二进制格式输出: _)ERi*}x8
double a = 10; #3.\}d)
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));