以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 zHk7!|%Y
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 hLF ;MH@
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 L1YiXJ,T,
象当作char数组来处理。 b?nORWjC
template<class Container> POt8G
class bit_iterator : public std::iterator<bidirectional_iterator_tag, NH0uK
void, void> Pj{Y
{ 40Hm+Ge
public: i;mA|
explicit bit_iterator(Container& c) : m_container(&c) ;cp,d~m rf
{ H/N4tWk"
m_size = 8*sizeof(Container); go
B'C
m_index = 0; 6"<q{K
} a+PVi
explicit bit_iterator() : m_container(0) ]8dzTEjk
{ ^!sIEL
m_size = 8*sizeof(Container); %2^wyVkq:
m_index = m_size; bW^JR,
} ,WQg.neOA
bool operator* () 0UOjk.~b
{ ]1&}L^a
char mask = 1; 67T=ku
char* pc = (char*)m_container; #9CLIYJAd
int i = (m_size-m_index-1)/8; NNw0
G&
int off = (m_size-m_index-1)%8; olca
Z
mask <<=off; .T\_4C
return pc & mask; osZ]R
} Q%n$IQr4gM
bit_iterator<Container>& operator++() 'e:(61_
{ 3V%ts7: a
m_index++; }0~X)Vgm(
return *this; g[$4a4X
} zLybf:#
bit_iterator<Container>& operator++(int) MZ"|Jn
{ Js/QL=,
m_index++; 66-G)+4
return *this; )SyU
} njckPpyb@
bool operator==(bit_iterator<Container>& bitIt) |(3"_
{ 5[Uv%A?H#_
return m_index == bitIt.m_index; :s>x~t8g#n
} 4}F~h
bool operator!=(bit_iterator<Container>& bitIt) S<eB&qT$
{ f[wxt n'r
return !(*this == bitIt); qB5.of[N!
} lb\VQZp!y
protected: r1/9BTPKdJ
Container* m_container; FA!!S`{\
private: l;i/$Yu7
int m_size; #eIFRNRb)
int m_index; h&2l0|8k
}; aKz:hG
`T3B
用该迭代器可以将任意类型对象以二进制格式输出: ^MO})C
double a = 10; ,-[z?dvO
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));