以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 mWv3!i;G<s
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 q?Cnav`DY
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 n#cC+>*>+
象当作char数组来处理。 %7QV&[4!
template<class Container> # ncRb
class bit_iterator : public std::iterator<bidirectional_iterator_tag, l.(v^3:X
void, void> *o]L|Vu
{ >;jZa
public: |+{)_?
explicit bit_iterator(Container& c) : m_container(&c) ?'IP4z;y
{ C/_ZUF(V
m_size = 8*sizeof(Container); @hl.lq
m_index = 0; /~DI 6g
} fPU`/6
explicit bit_iterator() : m_container(0) k}S :RK
{ _;W.q7b]
m_size = 8*sizeof(Container); {k(g]#pP
m_index = m_size; @g|v;B|{
} u/UrAqw
bool operator* () 2_)\a(.Qu
{ {WJ m
char mask = 1; G5{T5#
char* pc = (char*)m_container; W= ig.-
int i = (m_size-m_index-1)/8; <'}YyU=
int off = (m_size-m_index-1)%8; *HU &4E\a
mask <<=off; #`~C)=-
return pc & mask; +<'Ev~
} pLl(iNf]
bit_iterator<Container>& operator++() s'3
s^Dd
{ We)xB
m_index++; oph}5Krd)
return *this; ;^+\K-O]c
} H
h4WMZJG
bit_iterator<Container>& operator++(int) c& <Fr[AK
{ &g#@3e1>
m_index++; }?lrU.@zg
return *this; []D&bYpv
} t1]K<>g
bool operator==(bit_iterator<Container>& bitIt) 3v(* 5
{ 9/9j+5}+
return m_index == bitIt.m_index; ;$HftG>B
} .28<tEf
bool operator!=(bit_iterator<Container>& bitIt) YP
6`L
{ -<6\1J
return !(*this == bitIt); 1eA7>$w}[
} QemyCCP+
protected: fAF1"4f
Container* m_container; S2E8Gq9
private: 7 G)ZN{'
int m_size; 65L6:}#
int m_index; }#3V+X
}; B)$| vK=
y@1+I~@
用该迭代器可以将任意类型对象以二进制格式输出: >d@&2F TO
double a = 10; 2{D{sa
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));