以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 s+C&\$E
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 id&;
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 noOG$P#
象当作char数组来处理。 WJ=eV8Uk
template<class Container> ~e ]83?
class bit_iterator : public std::iterator<bidirectional_iterator_tag, V8`t7[r
void, void> )@\= pE.H
{ ^0ipM/Lg
public: 5Ee%!Pk
explicit bit_iterator(Container& c) : m_container(&c) FuLP{]Y+AM
{ g15e|y)th
m_size = 8*sizeof(Container); @FdtM<X
m_index = 0; FJp~8
x=
} +VI2i~
explicit bit_iterator() : m_container(0) j2=jD G
{ %W+*)u72(
m_size = 8*sizeof(Container); ^6Hfq^ejt
m_index = m_size; 2^E.sf$f
} O9dIobu4
bool operator* () JN$v=Ox{
{ 3!,XR\`[
char mask = 1; f,k'gM{K
char* pc = (char*)m_container; k3}|^/bHJ
int i = (m_size-m_index-1)/8; /al(=zf
int off = (m_size-m_index-1)%8; xCEEv5(5
mask <<=off; O!\P]W4r$
return pc & mask; iLws;3UX;x
} )d2 <;c
bit_iterator<Container>& operator++() C*,-lk0b@
{ _ohZTT%l
m_index++; }'b3'/MJ
return *this; k>FMy#N|@
} ?nn`ud?f
bit_iterator<Container>& operator++(int) e>#*$4tg
{ 7*r
Q6rAP
m_index++; 8T):b2h
return *this; `kpX}cKK}
} \A6MVMF8
bool operator==(bit_iterator<Container>& bitIt) N&]v\MjI62
{ [V|,O'X ~
return m_index == bitIt.m_index; cuO(*%Is1
} j#f+0
bool operator!=(bit_iterator<Container>& bitIt) +?w 7Nm`
{ 0~iC#lHO
return !(*this == bitIt); hq6B
pE
} {KxeH7S
protected: 9TIyY`2!
Container* m_container; mSp-
private: j 6%X
int m_size; ug'I:#@2
int m_index; >XcbNZV
}; 2?u>A3^R
`MAee8u'
用该迭代器可以将任意类型对象以二进制格式输出: x%pC.0%
double a = 10; #=V%S
2~
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));