以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 xQ(KmP2hl
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 (>@syF%PB
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 4m g
7f^[+
象当作char数组来处理。 &rtz&}ZB;
template<class Container> oqU#I~ -
class bit_iterator : public std::iterator<bidirectional_iterator_tag, aN);P>
void, void> ThiPT|5u
{ k=q%FlE
public: GlkAJe]
explicit bit_iterator(Container& c) : m_container(&c) 07WIa@Q
{ 0kr& c;~
m_size = 8*sizeof(Container); sp]y! zb"5
m_index = 0; DB?PS^-2
} *ytd.^@r
explicit bit_iterator() : m_container(0) Vm%ux>}
{ :|6D@
m_size = 8*sizeof(Container); !5
:1'$d]H
m_index = m_size; /JY ph^3][
} $S-;M0G
x
bool operator* () FYE9&{]h
{ KV&_^xSoh|
char mask = 1; 5'L}LT8p@
char* pc = (char*)m_container; [Kj#KJxy
int i = (m_size-m_index-1)/8; lNp:2P
int off = (m_size-m_index-1)%8; VlXy&oZ
mask <<=off; U~`^Y8UF
return pc & mask; c3 ]^f6)?
} LCm}v&~%A
bit_iterator<Container>& operator++() lSsFI30
{ <:}AC{I
m_index++; !urd
$Ta
return *this; T%vbD*nt.
} )ZT0zIG
bit_iterator<Container>& operator++(int) f$*9J
{ o_+Qer=O6
m_index++; d:WhP_rK9
return *this; -bX.4+U
} H;8]GE2n
bool operator==(bit_iterator<Container>& bitIt) #a>!U'1|
{ @<{#v.T
return m_index == bitIt.m_index; @x>2|`65Y
} XA^:n+Yo
bool operator!=(bit_iterator<Container>& bitIt) :1
{ ><[.
return !(*this == bitIt); YU"\Wd[
} |>V>6%>vK6
protected: Uwil*Jh
Container* m_container; k EDZqUD
private: =ZL}Av}
int m_size; 5}aC'j\
int m_index; r:Tb{cA
}; H%%nB
h>Pg:*N,(
用该迭代器可以将任意类型对象以二进制格式输出: ;|%JvptwW%
double a = 10; 7anpz%
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));