以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 lcUL7
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 E3gQ`+wNg?
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 l7x%G@1#~W
象当作char数组来处理。 YEZ"BgUnbp
template<class Container> G7),!Qol
class bit_iterator : public std::iterator<bidirectional_iterator_tag, i\t4TdEx(
void, void> wiFckF/
{ a{-}8f6
public: ;XTP^W!6f
explicit bit_iterator(Container& c) : m_container(&c) ^(6.M\Q
{ TI*uNS;-
m_size = 8*sizeof(Container); 35,SP R
m_index = 0; +Uk/Zg
w^
} S&QZ"4jq
explicit bit_iterator() : m_container(0) ].Et&v
{ zb9$
m_size = 8*sizeof(Container); R"82=">v
m_index = m_size; K}wUM^
} Uh9$e
bool operator* () :ox+WY
{ $MP'j9-S?
char mask = 1; ,ur_n7+LH
char* pc = (char*)m_container; N2x\O~7
int i = (m_size-m_index-1)/8; JM!o(zbt
int off = (m_size-m_index-1)%8; K\;b3
mask <<=off; 0_%u(?
return pc & mask; 3
D+dM0wM
} WAob"`8]
bit_iterator<Container>& operator++() m+V'*[O{
{ cQN}z
Ke
m_index++; ,H.q%!{h_
return *this; C9*'.~
} ,!Q2^R
bit_iterator<Container>& operator++(int) L.erP*
w
{ /<M08ze
m_index++; nC2A&n