以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 7X q,z
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 SHbtWq}T
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 RwPN gRF
象当作char数组来处理。 &8>IeK{I
template<class Container> )XakJU^o
class bit_iterator : public std::iterator<bidirectional_iterator_tag, ^m"u3b4
void, void> X*39c
b(b
{ feNdMR7eM
public: zj`v?#ET
explicit bit_iterator(Container& c) : m_container(&c) pUq1|)g
{ [*H N"
m_size = 8*sizeof(Container); 4.h=&jz&
m_index = 0; X M#T'S9y8
} .ir<s>YM
explicit bit_iterator() : m_container(0) Q/I!}C4
{ `'c_=<&n
m_size = 8*sizeof(Container); x&9hI
m_index = m_size; C\nhqkn
} 6morum
bool operator* () 2f:Eof(B
{ }i`PGx
char mask = 1; {Jx4xpvPo
char* pc = (char*)m_container; gu<'QV"
int i = (m_size-m_index-1)/8; ("+}=*?OF3
int off = (m_size-m_index-1)%8; kc @[9eV
mask <<=off; zG9Y!SY\-
return pc & mask; !n$tr
} AvSM^
bit_iterator<Container>& operator++() kRD%b[*d
{ Zh*u(rO
m_index++; Z@&Dki
return *this; Ucm :S-
} %1O[i4s:-
bit_iterator<Container>& operator++(int) H5]^
6
HwX
{ 2eC(Ijq[a
m_index++; !V\Q<So<
return *this; T
G{k0cdOT
} t{FlB!jv
bool operator==(bit_iterator<Container>& bitIt) 92d6U2T4&
{ 4Hn`'+b
return m_index == bitIt.m_index; no]z1D
} wUQw!%?>
bool operator!=(bit_iterator<Container>& bitIt) 0iK;Egwm
{ {h2TD
P
return !(*this == bitIt); pT1[<X!<s
} x-<)\L&
protected: C,NxE5?h
Container* m_container; &q