以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 o@DlK`
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 V})b.\"F
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 Kb*X2#;*
象当作char数组来处理。 bt0Q6v5
template<class Container> E6s)J -a
class bit_iterator : public std::iterator<bidirectional_iterator_tag, 75*q^ui
void, void> U6LENY+Ja
{ ,2`FSL%J
public: ] 5:0.$5
explicit bit_iterator(Container& c) : m_container(&c) lD@`xq.M;
{ `z?h=&N
m_size = 8*sizeof(Container); ,?`Zrxe[
m_index = 0; )]3_o!o
} Xx
e07J~
explicit bit_iterator() : m_container(0) roHJ$~q?
{ G^qt@,n$;
m_size = 8*sizeof(Container); +`l)W`zX
m_index = m_size; ja+PVf
} xw~3x*{
bool operator* () d3tr9B
{ ]T1\gv1~
char mask = 1; (Kb_/
char* pc = (char*)m_container; Q>
J9M`a
int i = (m_size-m_index-1)/8; tqwAS)v=
int off = (m_size-m_index-1)%8; J @^Ypq
mask <<=off; 2su/I
return pc & mask; I7Xm~w!{qk
} (KnU-E]L
bit_iterator<Container>& operator++() GVld]ioycG
{ l3HfaCP6:
m_index++; pRGag~h|E
return *this; Fu[<zA^
} W>y&
bit_iterator<Container>& operator++(int) u{%dm5
{ :fA|J!^b[
m_index++; J)._&O$
return *this; HJt@m
&H|
} _DLELcH
Y
bool operator==(bit_iterator<Container>& bitIt) 57[tUO
{ ^:Fj+d
return m_index == bitIt.m_index; bO+]1nZ.
} Y4{/P1F
bool operator!=(bit_iterator<Container>& bitIt) Ff&kK5}q
{ uo-1.[9ds
return !(*this == bitIt); KuZZKh
} IH3Nkpsg
protected: DLD 5>
Container* m_container; A\ r}V-
private: "2z&9`VIY
int m_size; <ZjT4><
int m_index; UT_kw}1o
}; <HH\VG\H6
N^f_hL|:9
用该迭代器可以将任意类型对象以二进制格式输出: i $lp8Y2ih
double a = 10; U88gJ[$
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));