以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 I)O-i_}L&K
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 c66Iy"
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 :/Nz' n
象当作char数组来处理。 ou-5iH?
template<class Container> D1lHq/
class bit_iterator : public std::iterator<bidirectional_iterator_tag, bd<zn*HZ*
void, void> Oy[t}*Ik
{ J2H8r 'T
public: 8c3X9;a
explicit bit_iterator(Container& c) : m_container(&c) 2Sb~tTGz79
{ f5/ba9nI
m_size = 8*sizeof(Container); q@u$I'`Bs
m_index = 0; B69 NL
} ]]%CO$`T[
explicit bit_iterator() : m_container(0) fi#o>tVyJ
{ H,=??wN
m_size = 8*sizeof(Container); DjL(-7'p
m_index = m_size; #,
vN
} e v?Hz8Q;(
bool operator* () ({zp$P}
{ ;nv4lxm
char mask = 1; }
ho8d+A
char* pc = (char*)m_container; z/rN+ ,
int i = (m_size-m_index-1)/8; #!y|cP~;I
int off = (m_size-m_index-1)%8; K |Yr
mask <<=off; m&|?mTo>m
return pc & mask; Q.6pmaXrb
} ZT_ EpT=1
bit_iterator<Container>& operator++() ?^IM2}(p
{ g[@]OsX
m_index++; hlkf|H
return *this; E9226
} .Fh5:WN
bit_iterator<Container>& operator++(int) 35jP</
{ sOLo[5y'
m_index++; F/RV{} 17E
return *this; [N#2uo
} Cg21-G.
bool operator==(bit_iterator<Container>& bitIt) qdj,Qz9ly
{ (g~&$&pa
return m_index == bitIt.m_index; FJ>| l#nO
} m=NX;t
bool operator!=(bit_iterator<Container>& bitIt) yNY1g?E
{ )X| uOg&|
return !(*this == bitIt); {u46m
} 3r^i>r8B
protected: D@d/O
Container* m_container; eB!0:nHN
private: WZ~rsSZSV
int m_size; ~`mOs1 d
int m_index; |$9k
z31
}; &&(sZGw
Ty#L%k}-t
用该迭代器可以将任意类型对象以二进制格式输出: g4j?E{M?
double a = 10; kfA%%A
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));