以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 Jy)KqdkX+
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 `7[EKOJ3g
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 J#w
J4!
象当作char数组来处理。 p~SClaR3H
template<class Container> kW*f.!
class bit_iterator : public std::iterator<bidirectional_iterator_tag, Sm)Ha:[4
void, void> 4A8;tU$&
{ [0(B>a3J
public: Q9~*<I> h;
explicit bit_iterator(Container& c) : m_container(&c) Xnz3p"
{ ?j40}
B]]d
m_size = 8*sizeof(Container); ey2S#%DF]
m_index = 0; ).Fpgxs
} M^O2\G#B
explicit bit_iterator() : m_container(0) /q<__N
{ +aJ>rR
m_size = 8*sizeof(Container); SO IHePmwK
m_index = m_size; |bq$xp
} TOkp%@9/
bool operator* () ?\vh9
{ %6t2ohO"
char mask = 1; T;L>;E>B
char* pc = (char*)m_container; 7({]x*o*%
int i = (m_size-m_index-1)/8; >64P6P;S
int off = (m_size-m_index-1)%8; S& SQ
mask <<=off; Jbjmv:db
return pc & mask; E8pB;\Z(
} wCr(D>iM
bit_iterator<Container>& operator++() Q?nN!eT
{ byLft1
m_index++; R$q;
!
return *this; spdvZU=}
} M@`;JjtSA
bit_iterator<Container>& operator++(int) v*;-yG&
{ n&"B0y cF
m_index++; -&3hEv5
return *this; qHuZcht
} bL'aB{s
bool operator==(bit_iterator<Container>& bitIt) P+s!|7'
{ A Y*e@nk\
return m_index == bitIt.m_index; .$qnZWcgG
} i>D.!x
bool operator!=(bit_iterator<Container>& bitIt) ?98("T|y;
{ :[O
8
return !(*this == bitIt); t; 4]cg:_
} i(AT8Bo2
protected: G_0(
|%
Container* m_container; fDT%!
private: kS_(wpA
int m_size; Oy%''+g
int m_index; fz\9 S
}; #:[t^}
cd(GvX'
用该迭代器可以将任意类型对象以二进制格式输出: ^lA=* jY(
double a = 10; Fh`~`eog
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));