以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 wP|Amn+;
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 ^<$$h
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 0c-.h
象当作char数组来处理。 \zx &5a
#
template<class Container> ~]w|ULNa3|
class bit_iterator : public std::iterator<bidirectional_iterator_tag, _ ^2\/@
void, void> #
dA-dN
{ o$4i{BL
public: "Y1]6
Zu
explicit bit_iterator(Container& c) : m_container(&c) wI0NotC
{ "r+ v^
m_size = 8*sizeof(Container); R5"5Z?'
m_index = 0; :m&cm%W]ts
} w4AA4u
explicit bit_iterator() : m_container(0) Bd++G'FZ
{ t^k^e{,q#
m_size = 8*sizeof(Container); z~m{'O`
m_index = m_size; Q
*]d[
} l* ap$1'
bool operator* () g+RgDt9
{ ^CBc~um2
char mask = 1; 9Z[EzKd<~'
char* pc = (char*)m_container; Y^Y1re+}
int i = (m_size-m_index-1)/8; 1WP(=7$.
int off = (m_size-m_index-1)%8; /%9Ge AAs
mask <<=off; Yl$R$u)
return pc & mask;
23(j <
} .="/n8B
bit_iterator<Container>& operator++() V7gv@<1<y
{ LvPcH
m_index++; w;OvZo|
return *this; Au\j6mB
} mVs<XnA47
bit_iterator<Container>& operator++(int) lSG"c+iV
{ \jpm
m_index++; _\ &