以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 yEfV8aY'*
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 -\`n{$OR
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 2S\~
象当作char数组来处理。 =e)[?{H
template<class Container> +jD{O @9
class bit_iterator : public std::iterator<bidirectional_iterator_tag, U&mJ_f#M
void, void> %q@eCN
{ 2\z"6
public: C||A[JOS
explicit bit_iterator(Container& c) : m_container(&c) G'<J8;B*
t
{ .bYDj&]P{
m_size = 8*sizeof(Container); M_2[Wypw
m_index = 0; e,}]K'!t
} .FnO
explicit bit_iterator() : m_container(0) 1;l&ck-Gg/
{ ZL`G<Mo;.
m_size = 8*sizeof(Container); 2b]'KiX
m_index = m_size; q(Y<cJ?X
} I,r 3.2u
bool operator* () %&yD^q_
{ Yp`6305f
char mask = 1; =Po!\[SBU
char* pc = (char*)m_container; OKp(A
int i = (m_size-m_index-1)/8; sM?bUg0w
int off = (m_size-m_index-1)%8; pX]*&[X?
mask <<=off; {37DrSOa
return pc & mask; S< <xlW
} |*N.SS
bit_iterator<Container>& operator++() OjCT*qyU<
{ +SmcZ^\OZ
m_index++; HB4Hz0Fa
return *this; [ed%"f
} %T UljX K}
bit_iterator<Container>& operator++(int) ! G%LYHx
{ 8Us5Oi
m_index++; MO:##C
return *this; QK\QvU2y
} }B_n}<tjD
bool operator==(bit_iterator<Container>& bitIt) }`$:3mb&f
{ <