以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 8%Wg;:DZx
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 S]P80|!|
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 b')Lj]%;k
象当作char数组来处理。 o
C5}[cYD`
template<class Container> D+y_&+&,t
class bit_iterator : public std::iterator<bidirectional_iterator_tag, x;G~c5
void, void> ZgXn8O[a
{ @`hnp:
public: \Jcj4
explicit bit_iterator(Container& c) : m_container(&c) s[ CnJZ\q
{ c<(LXf+61
m_size = 8*sizeof(Container); RCS91[
m_index = 0; Dn}Wsd=
} :EXH8n&|
explicit bit_iterator() : m_container(0) W/U_:^[-
{ $?dAO}f3O)
m_size = 8*sizeof(Container); ^J([w~&
m_index = m_size; F$;vPAxbK"
} )bM #s">Y
bool operator* () 2Sq+w;/
{ ?^# h|aUp.
char mask = 1; iTt#%Fs)4M
char* pc = (char*)m_container; +h*.%P}o
int i = (m_size-m_index-1)/8; !*U#,qY
int off = (m_size-m_index-1)%8; =Wl*.%1 b
mask <<=off; Hko(@z
return pc & mask; L
1fK
} f
+#
bit_iterator<Container>& operator++() w84
]s%y
{ Z1(-FT6O
m_index++; ~+y0UEtq7
return *this; aWLeyXsAu
} t;Rdrk
bit_iterator<Container>& operator++(int) Qoj}]jve
{ A5lP%&tu(
m_index++; .45XS>=z#
return *this; Y'.WO[dgf
} <z>K{:+>
bool operator==(bit_iterator<Container>& bitIt) U2 tsHm.O
{ .
k6)
return m_index == bitIt.m_index; NMSpi[dr
} 4LCgQS6
bool operator!=(bit_iterator<Container>& bitIt) r "^{?0
{ [":[\D'
return !(*this == bitIt); !eoN
} kXj%thDx
protected: I<w`+<o(
Container* m_container; !U,^+"l'GP
private: cI)XXb4
int m_size; bw@DcT&,
int m_index; ]~,V(K
}; ^J8sR4p#
62BJ;/ ]
用该迭代器可以将任意类型对象以二进制格式输出: BO5gwvyI
double a = 10; 9`8\<a'rU
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));