以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 30s; }
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 HmMO*k<6@
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 fN@{y+6
象当作char数组来处理。 :5J_5,?;`
template<class Container> h h"h
j
class bit_iterator : public std::iterator<bidirectional_iterator_tag, 5Q W}nRCZ
void, void> w9MoT.kI}
{ PQ$sOK|/
public: {{\ce;hN
explicit bit_iterator(Container& c) : m_container(&c) V7EQ4Om:It
{ 4ZwKpQ6
m_size = 8*sizeof(Container); TkRmV6'w
m_index = 0; X d3}Vn=
} A
(okv
explicit bit_iterator() : m_container(0) A|L'ih/
{ ]W/>Ldv
m_size = 8*sizeof(Container); !J3UqS
m_index = m_size; /,2rjJ#b
} YHB9mZi
bool operator* () RO.U(T
{ H>XFz(LWh
char mask = 1; 2o4^
char* pc = (char*)m_container; uR$i48}
int i = (m_size-m_index-1)/8; H; Ku
w
int off = (m_size-m_index-1)%8; :5b0np!
mask <<=off; GSi>l,y'
return pc & mask; vcv CD7MD
} Ch19h8M
bit_iterator<Container>& operator++() >P=Q #;v
{ d|lpec
m_index++; Yf}xwpuLk
return *this; i{Ds&{
} ]Y`Ib0$
bit_iterator<Container>& operator++(int) ]{GDS! )
{ }r%X`i|
m_index++; e#S0Fk)z
return *this; esX)"_xf
} _las;S'oa
bool operator==(bit_iterator<Container>& bitIt) -oP'4QVb
{ =r9r~SR#
return m_index == bitIt.m_index; b~w=v_[(I
} /.1.MssQM
bool operator!=(bit_iterator<Container>& bitIt) %IY``r)j
{ ypdT&5Mqb!
return !(*this == bitIt); =0
} mJ}opy!{;
protected: C\*4q8(
Container* m_container; +>\id~c(
private: . (}1%22
int m_size; `5~3G2T
int m_index; i+{yMol1
}; j)C:$
.@ F]Pht
用该迭代器可以将任意类型对象以二进制格式输出: ,9D+brm
double a = 10; _iV]_\0W2
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));