以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 x:TBZh?@$
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 ?b',kN,(
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 DAs&4Y`
象当作char数组来处理。 9Y:JA]U&8
template<class Container> 65FdA-4
class bit_iterator : public std::iterator<bidirectional_iterator_tag, iz'#K?PF_
void, void> } D5*
{ qaBjV6loy
public: &KfRZ`9H
explicit bit_iterator(Container& c) : m_container(&c) #JAU5d
{ (bfHxkR.
m_size = 8*sizeof(Container); D#>+]}5@x
m_index = 0; pdnkHR$
} Xg*IOhF6x
explicit bit_iterator() : m_container(0) lk $S"OH!
{ A1xY8?#?~c
m_size = 8*sizeof(Container); xyO]Evg
m_index = m_size; ygm4A j>
} h.Cr;w,2R
bool operator* () 0{ovLzW
{ {7^7)^@
char mask = 1; yteJHaq
char* pc = (char*)m_container; rvT75dV0
int i = (m_size-m_index-1)/8; MpbH!2J
int off = (m_size-m_index-1)%8; .pNPC|XU
mask <<=off; `Q2
`":
return pc & mask; iE}jilU
} S[fzy$">
bit_iterator<Container>& operator++() ]A}'jP
{ vt`hY4
m_index++; -#]?3*NO
return *this; c nAwoTt4
} A8JEig 3Ix
bit_iterator<Container>& operator++(int) ;I'pC?!y
{ xZ2}1D
m_index++; [3`T/Wm
return *this; 7)zn[4v7qt
} =re1xR!E5
bool operator==(bit_iterator<Container>& bitIt) 9 F~U%
>GX
{ t0Q/vp*/
return m_index == bitIt.m_index; ~ei\~;n\@
} ^6v ob
bool operator!=(bit_iterator<Container>& bitIt) ^ri?eKy.-g
{ )i&9)_ro
return !(*this == bitIt);
v#/Uq?us
} 9WQC\/w
protected: E?|"?R,,,
Container* m_container; 5#JGNxO
private: )I<p<HQD
int m_size; J&~nD(&TY
int m_index; eWO^n>Y
}; [T', ZLR|
ocwRU0+j
用该迭代器可以将任意类型对象以二进制格式输出: kvh}{@|-
double a = 10; ^.Y"<oZSS
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));