以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 9HG" }CGZP
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 3}x6IM2
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 RWdx)qj{
象当作char数组来处理。 ^KjxQO6y3
template<class Container> :~LOw}N!aQ
class bit_iterator : public std::iterator<bidirectional_iterator_tag, Po7oo9d
void, void> F,h}HlU
{ 2UrE>_
public: }cd-BW
explicit bit_iterator(Container& c) : m_container(&c) ROj9#:
{ x>[f+Tc
m_size = 8*sizeof(Container); C3-I5q(V]
m_index = 0; l;vA"b=]
} GEZ!z5";BQ
explicit bit_iterator() : m_container(0) P.'$L\
{ naiy] oY"
m_size = 8*sizeof(Container); ku^0bq}BrH
m_index = m_size; @i>o+>V
} o0#zk
bool operator* () IIUTo
{ 7~2V5@{<
char mask = 1; 2O
"
~k
char* pc = (char*)m_container;
dEK bB
int i = (m_size-m_index-1)/8; ,Lr}P
int off = (m_size-m_index-1)%8; G4QsR7
mask <<=off; mExJ--}
return pc & mask; #bCzWg
} #waK^B)<a
bit_iterator<Container>& operator++() f (ug3(j
{ =:(<lKf,<F
m_index++; Azag*M?
return *this; G[s/M\l
} 4{#0ci{
bit_iterator<Container>& operator++(int) -|(
q9B
{ ggHz-oNY
m_index++; ](SqLTB+?
return *this; (tzfyZ M
} GpGq' 8|(
bool operator==(bit_iterator<Container>& bitIt) ^k4 n
{ O+PRP"$g"
return m_index == bitIt.m_index; &D#B"XI
} yYPFk
bool operator!=(bit_iterator<Container>& bitIt) g{^(EZ,
{ C0-,<X
return !(*this == bitIt); ydf;g5OZ
} 2/RW( U
protected: !Tu4V\^~A
Container* m_container; 'OvyQ/T
private: ^/"2s}+
int m_size; 3TF'[(K=
int m_index; W0s3nio
}; p^U#1c
{^6<Ohe4j
用该迭代器可以将任意类型对象以二进制格式输出: _v +At;Y
double a = 10; a.B<W9$`
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));