以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 :h3n[%
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 DUF$-'A
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 j?k|-0
象当作char数组来处理。 87eH~&<1
template<class Container> h/8p2Mrqi
class bit_iterator : public std::iterator<bidirectional_iterator_tag, VhAJ1[k4!
void, void> Ip)u6We>I
{ K~S*<?
public: nXI8 `7D
explicit bit_iterator(Container& c) : m_container(&c) H~>8q~o]
{ 9nFWJn
m_size = 8*sizeof(Container); KH=3HN}
m_index = 0; DxpJP,wY3
} Y3(I;~$!
explicit bit_iterator() : m_container(0) Tm7LaM
{ MEp{v|1
m_size = 8*sizeof(Container); x7`+T1IJ
m_index = m_size;
gwXmoM5
} S{f,EBE
bool operator* () %f1IV(3Qc
{ Hr!$mf)h
char mask = 1; -Wh 2hWg+
char* pc = (char*)m_container; G#6Z@|kVw
int i = (m_size-m_index-1)/8; KT >Y^
int off = (m_size-m_index-1)%8; ?d{O'&|:
mask <<=off; %^nNt:N0
return pc & mask; \+l_H4\`K
} iDhC_F|
bit_iterator<Container>& operator++() DQc\[Gq&
{ kp}[nehF
m_index++; s@y;b0$gk
return *this; g#7Q-n3^
} }&2,!;"">3
bit_iterator<Container>& operator++(int) v9S=$Aj
{ 8c_X`0jy
m_index++; i?uX'apk
return *this; @7.7+blS"H
} !y'>sAf
bool operator==(bit_iterator<Container>& bitIt) Ht\2 IP
{ v&WK9F\
return m_index == bitIt.m_index; 9PV+Kr!c5I
} k_zn>aR$F
bool operator!=(bit_iterator<Container>& bitIt) 4gNN "
{ Iwh0PfWJ
return !(*this == bitIt); :M f8q!Q'
} -o{ x
;:4
protected: n"D` =
Container* m_container; =NI?Jk*iAq
private: 1,Mm+_)B
int m_size; hiA\~}sl n
int m_index; UL>2gl4s/
}; >w,jaQ
M+HhTW;I=
用该迭代器可以将任意类型对象以二进制格式输出: XuHR
double a = 10; Wi>m}^}9
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));