以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 ez>@'yhK
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 ~k3r$e@
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 ![V-
e
象当作char数组来处理。 @:I/lg=Qd
template<class Container> M{QNpoM
class bit_iterator : public std::iterator<bidirectional_iterator_tag, HPQ ,tlp6j
void, void> OA0\b_
{ `L>'9rbZO
public: elN3B91\6r
explicit bit_iterator(Container& c) : m_container(&c) t}nRW o
{ ;Z*RCuwg
m_size = 8*sizeof(Container); d\f5\Y
m_index = 0; ;xc
} 6eD[)_?]y
explicit bit_iterator() : m_container(0) TxWjgW~
{ ;`+,gVrp
m_size = 8*sizeof(Container); HChewrUAn
m_index = m_size; 7d*<'k]{,
} s7?kU3y=s
bool operator* () mx yT==E
{ Fk43sqU6~
char mask = 1; a lR}|ez
char* pc = (char*)m_container; (ni$wjq=z^
int i = (m_size-m_index-1)/8; k<qQ+\X
int off = (m_size-m_index-1)%8; MqqS3
mask <<=off; Q7\Ax0
return pc & mask; jDoWSYu4tY
} %WNy=V9txp
bit_iterator<Container>& operator++() N?XN$hwdZ
{ w <ID<
m_index++; Ou%>Dd5|?
return *this; lV?SvXe
} lFcCWy
bit_iterator<Container>& operator++(int) %YXC-E3@O
{ -~q]0>
m_index++; SUw{xGp
return *this; kLhtkuS4
} uP$K{ )
bool operator==(bit_iterator<Container>& bitIt) UnPSJ]VW
{
P/Zo
return m_index == bitIt.m_index; ]~P?
} @lX)dY
bool operator!=(bit_iterator<Container>& bitIt) 9pgct6BO
{ 0[];c$r<
return !(*this == bitIt); =aCv
Xa&,
} aE"t['
protected: ~$$V=$&
Container* m_container; ziOmmL(r
private: p,+~dn;=
int m_size; T2dpn%I
int m_index; O6pjuhMx
}; &~&i >
}oG&zw
用该迭代器可以将任意类型对象以二进制格式输出: :\[F=
double a = 10; 0ePZxOSjD
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));