以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 U]R?O5K
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 CX':nai
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对
+ y.IDn^
象当作char数组来处理。 ,_rarU)[J
template<class Container> )[oU|!@
class bit_iterator : public std::iterator<bidirectional_iterator_tag, <O5;w
void, void> RMC|(Q<
{ ` N(.10~
public: 8<n8joO0
explicit bit_iterator(Container& c) : m_container(&c) *`}_e)(k
{ CI{]o&Tf
m_size = 8*sizeof(Container); ,zXL8T
m_index = 0; #EHBS~^
} qoZ* sV
explicit bit_iterator() : m_container(0) ZX'{o9+w5
{ h| UT/:
m_size = 8*sizeof(Container); oTI*mGR1Z
m_index = m_size; TP{a*ke^5,
} F5
LQgK-z
bool operator* () iqy}|xAU
{ Y ga}8DU
char mask = 1; tEN]0`
char* pc = (char*)m_container; o95O!5 hl
int i = (m_size-m_index-1)/8; e!4akKw4wD
int off = (m_size-m_index-1)%8; =~=/ d q
mask <<=off; $elrX-(vL
return pc & mask; R8'yQ#FVy
} B10p7+NBF
bit_iterator<Container>& operator++() )sV#
b
{ ePs<jrB<
m_index++; <;=Y4$y[
return *this; +ypG<VBx%
} \=N
tbBL$[
bit_iterator<Container>& operator++(int) SOK2{xCG
{ {6%uNT>|
m_index++; >t D-kzN
return *this; ik$wS#1+L
} N7oMtlvL[w
bool operator==(bit_iterator<Container>& bitIt) J~_p2TZJ\3
{ G4x.''r&Sl
return m_index == bitIt.m_index; Z;>~<#!4
} J`RNik*>
bool operator!=(bit_iterator<Container>& bitIt) b,Z&P|
{ ='VIbE@qC
return !(*this == bitIt); +W;B8^imG
} `n5c|`6
protected: I.8|kscM
Container* m_container; 0'py7
private: /t>o
-
int m_size; y5Pw*?kn
int m_index; gE
,j\M*
}; h5f>'lz
w4x 8
Sre
用该迭代器可以将任意类型对象以二进制格式输出: mKsj7
double a = 10; .vW~(ZuD
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));