以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 LEOri=?RF
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 }& W=
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 7W*a+^
象当作char数组来处理。 z]SEPYq:
template<class Container> :?j=MV
class bit_iterator : public std::iterator<bidirectional_iterator_tag, :nR80]
void, void> @/?i|!6
{ b`$qKO
public: B'Jf&v
explicit bit_iterator(Container& c) : m_container(&c) {* :^K\-
{ SSCs96
m_size = 8*sizeof(Container); 0g6sGz=
m_index = 0; 2 S~( P
} 2@lGY_O!m
explicit bit_iterator() : m_container(0) !*L)v
{ by0K:*C
m_size = 8*sizeof(Container);
x`FTy&g
m_index = m_size; `"}).{N]C
} uY(8KW
bool operator* () +ue1+#
{ ',xUU{5?
char mask = 1; `)5WA{z
char* pc = (char*)m_container; UGd\`*Cj
int i = (m_size-m_index-1)/8; \+nV~Pi"A
int off = (m_size-m_index-1)%8; &tvtL
mask <<=off; f^*Yqa
return pc & mask; Ww60-d}}Q
} :.-z!
bit_iterator<Container>& operator++() ,`RX~ H=C
{ -)^vO*b 0
m_index++; ~c<8;,cjYR
return *this; S5u$I
} kS&>g
bit_iterator<Container>& operator++(int) XVqkw@Ia4!
{ @8>bp#x/1
m_index++; 7M4J{}9
return *this; 9PA<g3z
} M49l2x=]9
bool operator==(bit_iterator<Container>& bitIt) L%(NXSfu7
{ $[Z~BfSQ
return m_index == bitIt.m_index; 2"?D aX
} hrq% { !Z
bool operator!=(bit_iterator<Container>& bitIt) EnlAgL']|
{ 14 ,t
return !(*this == bitIt); U;WwEta ]
} Q.$Rhjb
protected: q`/J2r+O
Container* m_container; W>i%sHH6
private: zG<<MR/<
int m_size; tuIZYp8tIN
int m_index; lya},_WCq
}; p&x!m}!
~G@YA8}
用该迭代器可以将任意类型对象以二进制格式输出: ha$1vi}b
double a = 10; 6 5dMv*{
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));