以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 8 *4@-3Sx
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 2x7(}+eD
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 uI%N?
象当作char数组来处理。 E/"YId `A
template<class Container> i&A{L}eCr:
class bit_iterator : public std::iterator<bidirectional_iterator_tag, |Hx%f
void, void> /~H[= Pf
{ 3[MdUj1y[
public: MZCL:#
explicit bit_iterator(Container& c) : m_container(&c) <MPeh&_3#
{ 6@"Vqm|HD
m_size = 8*sizeof(Container); j4E H2v
m_index = 0; 8ku?
W
} I#i?**
explicit bit_iterator() : m_container(0) T{_1c oL
{ _oQtk^fp
m_size = 8*sizeof(Container); sx-EA&5-9k
m_index = m_size; [:AB$l*
} [NQmL=l
bool operator* () BhqhyX\D&y
{ L_tjcfVo
char mask = 1; z[WC7hvU
char* pc = (char*)m_container; 5."5IjZu
int i = (m_size-m_index-1)/8; ]XmQ]Yit
int off = (m_size-m_index-1)%8; zt7_r`#z
mask <<=off; Z6 t E{/
return pc & mask; kxwNbxC
} /6Y0q9
bit_iterator<Container>& operator++() RxlszyE
{ ]b}B~jD
m_index++; W\HLal
return *this; zx
ct(
} BmJkt3j."
bit_iterator<Container>& operator++(int) q!ee g
{ *y)4D[
z-
m_index++; $8jaapNm@
return *this; 6a7vlo
} ?lF mXZy`
bool operator==(bit_iterator<Container>& bitIt) H":/Ckok
{ \s,Iz[0Vfz
return m_index == bitIt.m_index; ]PeLcB
} )V=0IZi
bool operator!=(bit_iterator<Container>& bitIt) U$A/bEhw
{ 5i|s>pD4z1
return !(*this == bitIt); iwvt%7
} l+t #"3
protected: g4Y) Bz
Container* m_container; :qBGe1Sv(
private: :*#rRQ>t
int m_size; f(!E!\&n^
int m_index; pQqbZ3]
}; {W-5:~?"
6*sw,sU[y
用该迭代器可以将任意类型对象以二进制格式输出: kzMa+(fu
double a = 10; t
@;WgIp(&
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));