以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 ruyQ}b:zS
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 |.$7.8g
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 MOay^{u
象当作char数组来处理。 NFC/4
template<class Container> C\vOxBAB
class bit_iterator : public std::iterator<bidirectional_iterator_tag, ,yvS c
void, void> / {[p?7x>
{ q~Al[`K
public: FMhuCl2
explicit bit_iterator(Container& c) : m_container(&c) )4.-6F7U?
{ ^FVmP d*1
m_size = 8*sizeof(Container); N2Ysi$
m_index = 0; 71ab&V il
} b'z\|jY
explicit bit_iterator() : m_container(0) XHOS"o$y
{ `%EcQ}Nr
m_size = 8*sizeof(Container); *-uzsq.W
m_index = m_size; wh2E$b(-
} & JJ*?Dl
bool operator* () _ n1:v~
{ r .
(}
char mask = 1; 7$t['2j3
char* pc = (char*)m_container; wA)nryXV
int i = (m_size-m_index-1)/8; #0\* 86
int off = (m_size-m_index-1)%8; k#7A@Vb
mask <<=off; [7g-M/jvY
return pc & mask; FC||6vJth
} N9y+Psh
bit_iterator<Container>& operator++() +_u~Np
{ ^4'!B
+}F
m_index++; Fs(S!;
return *this; ~*UY[!+4^=
} 7,8TMd1`M
bit_iterator<Container>& operator++(int) 8?x:PkK
{ >"|t*kS
m_index++; tmM; Z(9t
return *this; jA[")RVG
} {,Rlq
bool operator==(bit_iterator<Container>& bitIt) N8x.D-=gG
{ fO
.=i1
E}
return m_index == bitIt.m_index; B@VAXmCaoV
} G;/l[mvh,
bool operator!=(bit_iterator<Container>& bitIt) g+c%J#F=
{ <P6d-+
return !(*this == bitIt); H*+7{;$
} ;:+2.//
protected: n}fV$qu
Container* m_container; yy&L&