以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 R?M>uaxn
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 ""*g\
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 J~C=o(r
象当作char数组来处理。 i8S=uJ]n
template<class Container> {W HK|l
class bit_iterator : public std::iterator<bidirectional_iterator_tag, }G<~Cx5[
void, void> D@kf^1G
{ {C0Y8:"`
public: u:^sEk"Lk'
explicit bit_iterator(Container& c) : m_container(&c) *K BaKS
{ OY2u,LF9H
m_size = 8*sizeof(Container); *%*Bo9a/
m_index = 0; |
^G38
} k5Su&e4]]
explicit bit_iterator() : m_container(0) ;]@Pm<f
{ r AE5.Q!u
m_size = 8*sizeof(Container); vM50H
m_index = m_size; o#=C[d5BV
} ("{"8
bool operator* () zrf
tF2U
{ RhC|x,E
char mask = 1; | AiMx2
char* pc = (char*)m_container; 3W{!\
int i = (m_size-m_index-1)/8; F)v
int off = (m_size-m_index-1)%8; UmY{2 nzY
mask <<=off; ;#9ioGx
return pc & mask; 1}Y3|QxF
} p$uPj*
bit_iterator<Container>& operator++() }kP<zvAaw
{ 3_`)QYU'
m_index++; XUnw*3tPJ
return *this;
J5';Hb)
} U`5/tNx
bit_iterator<Container>& operator++(int) {e q378d
{ q^?a|l
m_index++; #sxv?r
return *this; dMCoN8W
} jw`05rw:
bool operator==(bit_iterator<Container>& bitIt) a=`]
L`|N
{ w)B?j
return m_index == bitIt.m_index; sN2m?`?"G
} -m@PqJF^
bool operator!=(bit_iterator<Container>& bitIt) WIuYSt)h
{ r-yUWIr
S
return !(*this == bitIt); *,IK4F6>:
} v5@M 34
protected: >239SyC-,
Container* m_container; -*i_8`
private: A=IpP}7J
int m_size; x/wgD'?
int m_index; xVgm 9s$"c
}; iJZNSRQJ}r
GdY@$&z{i
用该迭代器可以将任意类型对象以二进制格式输出: ch25A<O<R.
double a = 10; *8po0s
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));