以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构
mPy=,xYyC
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 |Y6+Y{|\
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 ,s*-2Sz
象当作char数组来处理。 WZa?Xb
template<class Container> &xG>"sJ
class bit_iterator : public std::iterator<bidirectional_iterator_tag, i+)9ItZr
void, void> dd +%d
{ 1 U|IN=
public: k%5o5Hx
explicit bit_iterator(Container& c) : m_container(&c) O.%'
47A
{ `c zL$tN<P
m_size = 8*sizeof(Container); '7UW\KEB[}
m_index = 0; yrnIQu*Uu
} 4#o Lf1
explicit bit_iterator() : m_container(0) ppjS|l*`
{ 4]F:QS%
x
m_size = 8*sizeof(Container); #&A)%Qbg
m_index = m_size; %B&y^mZv*\
} U=4tJb
bool operator* () ahno$[
{ 3(De> gs$
char mask = 1; Q,#
)
char* pc = (char*)m_container; &"(xd@V)]A
int i = (m_size-m_index-1)/8; u!FX 0Ip
int off = (m_size-m_index-1)%8; 2aef[TY
mask <<=off; Ov$_Phm:
return pc & mask; lC8DhRd0_
} 6^M!p4$hF
bit_iterator<Container>& operator++() ^Gc#D:zU
{ ,,hW|CmN30
m_index++; -hx' T6G%
return *this; N<lO!x1[H*
} ^a6c/2K
bit_iterator<Container>& operator++(int) '$@bTW
{ #Ont1>T,G
m_index++; bnb:4?d]
return *this; %z}{jqD&:X
} ai!zb2j!E
bool operator==(bit_iterator<Container>& bitIt) ~|_s2T
{ U8+5{,$\.
return m_index == bitIt.m_index; {G:dhi
} lLq:(zMH
bool operator!=(bit_iterator<Container>& bitIt) o&
g01t
{ L1FTh
return !(*this == bitIt); Cy'0O>v5
} 3]=j!_yJf
protected: \^$g%a
Container* m_container; Fc{X$hh<
private: vN`2KCl~3
int m_size; \G+ hi9T(
int m_index; FwB}@)3
}; <6_RWtU
^XsIQz[q
用该迭代器可以将任意类型对象以二进制格式输出: TC7Rw}jF
double a = 10; j:)"s_
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));