以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 I'6ed`|
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 %(O^as
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 |Ls&~'ik
象当作char数组来处理。 8WLh]MD`
template<class Container> RY'\mt"W2
class bit_iterator : public std::iterator<bidirectional_iterator_tag, ^q4:zZZ
void, void> j*3sjOoC
{ ( .6tz
public: 5. +$v4
explicit bit_iterator(Container& c) : m_container(&c) +Fkx")
{ OFPd6,(E
m_size = 8*sizeof(Container); ?tal/uC
m_index = 0; `rOe5Zp$
} ;M(ehX
explicit bit_iterator() : m_container(0) $48[!QE
{ i,U-H\p&
m_size = 8*sizeof(Container); Y
GcY2p<
m_index = m_size; !513rNO
} Wpg?%+Y
bool operator* () FdK R{dX}
{ wTJMq`sY_
char mask = 1; 9g^./k\8%
char* pc = (char*)m_container; w~FO:/
int i = (m_size-m_index-1)/8; 9N3oVHc?
int off = (m_size-m_index-1)%8; .Q6{$Y%l
mask <<=off; '!|E+P-
return pc & mask; ht[TMdV
} ,_X,V!
bit_iterator<Container>& operator++() \gPNHL*
{ t g m{gR
m_index++; Y9(i}uTi
return *this; 0I AaPz/e
} @v:ILby4-
bit_iterator<Container>& operator++(int) >f9]Nj
{ C Ol%P
m_index++; enfu%"(K)
return *this; 5SPl#*W
} 0ju wDd
bool operator==(bit_iterator<Container>& bitIt) }M"'K2_Z
{ ^_#gIT\
return m_index == bitIt.m_index; S+\Mt+o
} YJtOdgG|q
bool operator!=(bit_iterator<Container>& bitIt) jWb\"0)
{ %/,Uk+3p
return !(*this == bitIt); 4VL!U?dk
} Se]t;7j
protected: V[2<ha[n>
Container* m_container; 14)kKWG
private: <pa];k(IQL
int m_size; -<VF6k<
int m_index; ^/RM;`h0
}; P$#}-15?|_
P^{`d_[K%
用该迭代器可以将任意类型对象以二进制格式输出: ^SL}wC x
double a = 10; ]a@v)aa-
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));