以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 ~GE$myUT\p
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 85EQ5yY
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 rc+C?)S
象当作char数组来处理。 $$:ZX
template<class Container> 1ygpp0IGJ
class bit_iterator : public std::iterator<bidirectional_iterator_tag, 0]D0{6x8
void, void> AiD[SR
{ XLMb=T~S
public: ?+T^O?r|O
explicit bit_iterator(Container& c) : m_container(&c) s@MYc@k
{ \om%Q[F7a
m_size = 8*sizeof(Container); PtqJ*Z
m_index = 0; eZ"1gYqy
} olLfko4$*V
explicit bit_iterator() : m_container(0) RwS@I/
{ $gBd <N9|c
m_size = 8*sizeof(Container); 5*[2yKsTi
m_index = m_size; L
8{\r$
} f|u#2!7
bool operator* () &3J@BMYp
{ P{Q=mEQ
char mask = 1; (C]o,7cYS
char* pc = (char*)m_container; '+j} >Q
int i = (m_size-m_index-1)/8; E( us'9c
int off = (m_size-m_index-1)%8; ]kG(G%r|M
mask <<=off; czlFr|O;
return pc & mask; DcSnia62f
} y4+;z2'>
bit_iterator<Container>& operator++() pm{|?R
{ e.c3nKXZ q
m_index++; 5BBD.!
return *this; +H$!a
} :$MG*/Q
bit_iterator<Container>& operator++(int) $=?@*p
{ OT'[:|x ;
m_index++; bI|2@HV2
return *this; 1~$);US
} ^&g=u5
d0
bool operator==(bit_iterator<Container>& bitIt) |d6T/Uxo
{ u{["50~
return m_index == bitIt.m_index; a~8[<F omj
} a1Qv@p^._b
bool operator!=(bit_iterator<Container>& bitIt) :x_'i_w
{ y^o@"IYu3
return !(*this == bitIt); gk`zA
} 3]?#he
protected: h<~7"ONhV
Container* m_container; Y2'cs~~$Ce
private: 1#1 riM -
int m_size; KD^N)&k^Kp
int m_index; RoAlf+&Qb
}; "fq{Y~F%`
KN-avu_Ix
用该迭代器可以将任意类型对象以二进制格式输出: S;]*) i,v
double a = 10; r_;9'#&'
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));