以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 $=f,z>j
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 `Jh> 1l
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 R$@|t?
象当作char数组来处理。 X[:&p|g]
template<class Container> $cri"G
class bit_iterator : public std::iterator<bidirectional_iterator_tag, }>cQ}6n.
void, void> |IqQ%;H
{ K9FtFd
public: Vcg$H8m
explicit bit_iterator(Container& c) : m_container(&c) gqaENU>
{ b$P=rIB
m_size = 8*sizeof(Container); n&=3Knbd@d
m_index = 0; odPq<'V|AY
} 1(`>9t02/?
explicit bit_iterator() : m_container(0) )TxAhaz+
{ /JL2dBy#z
m_size = 8*sizeof(Container); iWu$$IV?-
m_index = m_size; |1G /J[E
} U}7a;4?
bool operator* () }O<u
{ V.kUFTCvf
char mask = 1; ![Z'jCpy
char* pc = (char*)m_container; =<I 90j~)
int i = (m_size-m_index-1)/8; :]Jwcp
int off = (m_size-m_index-1)%8; #$xiqL
mask <<=off; 0nS69tH
return pc & mask; }"j7Qy)cs
} Wyf+xr'Ky
bit_iterator<Container>& operator++() N5 SK_+
{ AD4KoT&
m_index++; <">tB"="b
return *this; k9`Bi`wp
} '{j.5~4y
bit_iterator<Container>& operator++(int) z#*w Na&@[
{ xtyzy@)QL
m_index++; ( Kh<qAP_n
return *this; 4"fiEt,t<x
} D}l^ow
bool operator==(bit_iterator<Container>& bitIt) 89:Y s=
{ f5+a6s9
return m_index == bitIt.m_index; QfJ?'*
} P?dE\Po7
bool operator!=(bit_iterator<Container>& bitIt) X62h7?'Pd
{ s4bLL
return !(*this == bitIt); ~WK>+T,%
} MNNPBE
protected: !']=7It{
Container* m_container; +Gi~VW.
private: }wrZP}zM>
int m_size; Z[
}0K3,5
int m_index; jQOY \1SR
}; #L.fGTb
nmp(%;<exN
用该迭代器可以将任意类型对象以二进制格式输出: F MB\$(g
double a = 10; > bWsUG9
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));