以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 cd&sAK"
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 6Z@?W
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 l3Qt_I)L
象当作char数组来处理。 Bh UGMK
template<class Container> m0i,Zw{eM
class bit_iterator : public std::iterator<bidirectional_iterator_tag, N0pA ,&
void, void> ;S9
z@`a.
{ *L&|4|BF2
public: lqcPV) n
explicit bit_iterator(Container& c) : m_container(&c) n v
?u
{ =TGa\iclpB
m_size = 8*sizeof(Container); );/p[Fd2]
m_index = 0; e +Ikw1y"f
} !lL~#l:F
explicit bit_iterator() : m_container(0) "sSY[6Kp!
{ ]pWn%aGv*Y
m_size = 8*sizeof(Container); 2"QcjFW%
m_index = m_size; {(IHHA>
} 0Of6$`
bool operator* () C';Dc4j
{ 2c'<rkA
char mask = 1; *&z!y/
char* pc = (char*)m_container; RGLJaEl !
int i = (m_size-m_index-1)/8; s$kvLy<
int off = (m_size-m_index-1)%8; ^KJi|'B
mask <<=off; A6I^`0/
return pc & mask; @8Cja.H
} <M,<|Y*)
bit_iterator<Container>& operator++() ?L| Ai\|
{ 0Q~\1D 9g
m_index++; ^)o#/"JA
return *this; k]9y+WC2
} }ww`Y
bit_iterator<Container>& operator++(int) 19:1n]*X<
{ OYfRtfE
m_index++; OWp`Wat
return *this; E&ReQgBft
} -nZDFC8y$
bool operator==(bit_iterator<Container>& bitIt) `k7X|
{ eF(oHn,
return m_index == bitIt.m_index; NE><(02qW
} Z kBWVZb
bool operator!=(bit_iterator<Container>& bitIt) 50dx[v8
{ pQxv_4
return !(*this == bitIt); Ml,in49
} iX6*OEl/Q
protected: jItVAmC=i
Container* m_container; O<J<)_W)
private: fRwr}n'
int m_size; zCS&