以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 lRDxIuTK
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 V5a?=vK9
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 $(gGoL<
象当作char数组来处理。 &Vt2be*
template<class Container> &xiOTkqB
class bit_iterator : public std::iterator<bidirectional_iterator_tag, ;cI#S%uvpn
void, void> i-,D_
{ d=XpO*v,[
public: dC`tN5
explicit bit_iterator(Container& c) : m_container(&c) _1sMY hI
{ L)F1NuR
m_size = 8*sizeof(Container); 'j,oIqx
m_index = 0; +2DE/wE]e+
} BWUt{,?KU
explicit bit_iterator() : m_container(0) j1YH9T#|D
{ a@#Q:O)4
m_size = 8*sizeof(Container); ]U,CKJF%/
m_index = m_size; fxDj+Q1p
} 8xF)_UV
bool operator* () Wp5]Uk
{ P8wy*JvT
char mask = 1; ptpW41t}^
char* pc = (char*)m_container; |3{+6cg
int i = (m_size-m_index-1)/8; f.oP
int off = (m_size-m_index-1)%8; {l2N&
mask <<=off; f=ac I|w
return pc & mask; TMJ9~"IO
} o]Wz6L
bit_iterator<Container>& operator++() (kIz
{ pI7Ssvi^
m_index++; X9fNGM1
return *this; ,+tPRkwA^
} 3J%V%}mD
bit_iterator<Container>& operator++(int) q2e]3{l3
{ bj@xqAGl
m_index++; Q,.By&
return *this; 3;*z3;#}
}
?7#7:
bool operator==(bit_iterator<Container>& bitIt) 6b?`:$Cw3)
{ <EMkD1e
return m_index == bitIt.m_index; =m}TU)4.
} __!m*!sd
bool operator!=(bit_iterator<Container>& bitIt) Y@Y`gF6F
{ Ic'Q5kfM
return !(*this == bitIt); R]u
(l+`
} lv4(4$T
protected: ]cIu|bRO
Container* m_container; ~,ynJ]_aJB
private: ./l|8o
int m_size; .APVjqG
int m_index; }A|))Ao|
}; Wo{K}
0G5'Y;8
用该迭代器可以将任意类型对象以二进制格式输出: x>%joKY[
double a = 10; E0QPE5_
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));