以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 >9tkx/J
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 t7oz9fSz=?
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 3]`qnSYBv
象当作char数组来处理。 !|<f%UO
template<class Container> *K jVPs
class bit_iterator : public std::iterator<bidirectional_iterator_tag, pmW6~%}*
void, void> t6bWSz0
{ I0l.KiBm
public: xeYySM=
explicit bit_iterator(Container& c) : m_container(&c) I"Q9W|J_&
{ ;/";d]j
m_size = 8*sizeof(Container); t66f 7AR
m_index = 0; bpF@}#fT
} 86[RH!e
explicit bit_iterator() : m_container(0) 4-M6C 5#.
{ Eo {1y
m_size = 8*sizeof(Container); ZU|V+yT
m_index = m_size; =>:% n
} C`)^~C_]`3
bool operator* () N
t>HztXd
{ P96Cw~<Q?
char mask = 1; `z$uw
char* pc = (char*)m_container; v;bM.OL
int i = (m_size-m_index-1)/8; -Ty<9(~S
int off = (m_size-m_index-1)%8; qN1e{T8u
mask <<=off; \9>g;qPg}
return pc & mask; 1FD7~S|
} ^C:{z)"h
bit_iterator<Container>& operator++() 5gc:Y`7t
{ ]O[+c*|w
m_index++; Q_dXRBv=n
return *this; 9!O+Ryy?\
}
KF:]4`$
bit_iterator<Container>& operator++(int) lk*0c{_L
{ {m+S{dWp
m_index++; "]SJbuzh
return *this; gQI(=in
} tv@Z5
bool operator==(bit_iterator<Container>& bitIt) DV7<n&P
{ 3Y1TQ;i,wQ
return m_index == bitIt.m_index; c<+g|@A#
} zfP[1
bool operator!=(bit_iterator<Container>& bitIt) 4uO
@`0:x
{ 2[8fFo>
return !(*this == bitIt); de=5=>P7
} U5On-T5
protected: s]F?=yEp
Container* m_container; =0C l
private: (b`4&sQ<
int m_size; |i}+t
int m_index; \]f5
}; mJGO)u&
V(lK`dY
用该迭代器可以将任意类型对象以二进制格式输出: GG@I!2,_
double a = 10; YoV^xl6g
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));