以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 _QY "#
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 VM`."un]
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 dXhV]xK
象当作char数组来处理。 "( xu
template<class Container> 0OXd*
class bit_iterator : public std::iterator<bidirectional_iterator_tag, 04:Dbt~=?p
void, void> 4Ki'r&L\
{ (WC<X Kf
public: M-_)CR
explicit bit_iterator(Container& c) : m_container(&c) !=pemLvH
{ Zh$Z$85p
m_size = 8*sizeof(Container); ~7v^7;tT
m_index = 0; p-Ju&4fS
} 2bmppDk
explicit bit_iterator() : m_container(0) _4+1c5Q!
{ 9]iDNa/D
m_size = 8*sizeof(Container); ,7aqrg
m_index = m_size; 81&!!qhfS
} i2DR}%U
bool operator* () O?_'6T
{ qyto`n7
char mask = 1; n~Ix8|S h
char* pc = (char*)m_container; ^]HwStn&=
int i = (m_size-m_index-1)/8; KH-.Z0
2U
int off = (m_size-m_index-1)%8; SWt"QqBU
mask <<=off; hwJ.M4
return pc & mask; $HRpG
} |j;`;"+B
bit_iterator<Container>& operator++() 6tM{cK%v1
{ 2B#\683
m_index++; %o-*~GQ@B
return *this; 8}&cE#@
} 8wOr`ho B
bit_iterator<Container>& operator++(int) ]?2AFkF
{ -Ac^#/[0
m_index++; %2.T1X%!
return *this; Y*6*;0Kx
} r?$\`,;
bool operator==(bit_iterator<Container>& bitIt) &nq[Vy0kO4
{ +x1sV *S
return m_index == bitIt.m_index; kDrGl{U}
} < mxUgU
bool operator!=(bit_iterator<Container>& bitIt) Ur@3_F
{ F]&9Lp}
"
return !(*this == bitIt); G} p~VLf
} C/XOI>
protected: Pdv&X*KA
Container* m_container; &8N\
6K=
private: /cg!Ap5
int m_size; /Wa+mp
int m_index; 5HB4B <2
}; `JC!uc
S"dQ@r9
用该迭代器可以将任意类型对象以二进制格式输出: $ 8s&=OW
double a = 10; 3jQ
|C=
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));