以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 {<3>^ o|"
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 *PVv=SU
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 +w
pe<T
象当作char数组来处理。 dECH/vJ^
template<class Container> |6.1uRF E2
class bit_iterator : public std::iterator<bidirectional_iterator_tag, :'LG%E:b
void, void> =wy 3h0k^
{ H\Jpw
public: IN%04~=H
explicit bit_iterator(Container& c) : m_container(&c) ;c_pa0L
{ w+0Ch1$
m_size = 8*sizeof(Container); )bGd++2
m_index = 0; )4P5i
b
} Qe )#'$T
explicit bit_iterator() : m_container(0) JrdH6Zg
{ ].eY]o}=
m_size = 8*sizeof(Container); 1#3 Qa{i
m_index = m_size; BsX#
~
} SLze) ?.
bool operator* () Lx"a #rZ
{ mTW@E#)n
char mask = 1; %g>{m2o
char* pc = (char*)m_container; PNbs7f
int i = (m_size-m_index-1)/8; f1RfNiW.
int off = (m_size-m_index-1)%8; /:}z*a
mask <<=off; ohA@Zm8O
return pc & mask; c.\J_^
} fii\&p7z
bit_iterator<Container>& operator++()
Dy[
YL
{ F^]?'`7md
m_index++; D@ji1$K
return *this; iY2%_b!5
} z4nVsgQ$
bit_iterator<Container>& operator++(int) RO"*&o'K'
{ y=jTS
m_index++; a;A&>Ei}
return *this; oEWx9c{~$
} Ht'jm (
bool operator==(bit_iterator<Container>& bitIt) '\2lWR]ndd
{ Z)U#5|sf
return m_index == bitIt.m_index; ;')T}wuq
} 0CD2o\`8
bool operator!=(bit_iterator<Container>& bitIt) G"BoD 5m
{ X&<