以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 g_5:o
3s
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 TBvv(_
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 VLkK6W.u
象当作char数组来处理。 =0MW+-
template<class Container> O. V!L
class bit_iterator : public std::iterator<bidirectional_iterator_tag, &iId<.SiJ
void, void> 5! NK
{ sn]8h2z
public: C$b$)uI;
explicit bit_iterator(Container& c) : m_container(&c) 39BGwKXb
{ N? ky2wG
m_size = 8*sizeof(Container); =VH, i/@
m_index = 0; Cn[`]
} S6`4&0'
explicit bit_iterator() : m_container(0) AFF7fK
{ #xNLr
m_size = 8*sizeof(Container); qR--lvO
m_index = m_size; 5NZob<<
} oZA?}#DRl
bool operator* () Yvcd(2
{ dl6d!Nz*
char mask = 1; bN8GRK )
char* pc = (char*)m_container; ??CtmH
int i = (m_size-m_index-1)/8; l+*^P'0u
int off = (m_size-m_index-1)%8; S=n,unn#t
mask <<=off; CVyqr_n65/
return pc & mask; @K7#}7,t
} 2fu|X#R
bit_iterator<Container>& operator++() 7xb z)FI
{ weEmUw Z
m_index++; :lcZ)6&S
return *this; Vp.($
} D ?1$I0 =
bit_iterator<Container>& operator++(int) ?J<Y]
{ >sv|
m_index++; QU2\gAM
return *this; I!%T!B540
} =cs;avtL
bool operator==(bit_iterator<Container>& bitIt) w*Vf{[a'
{ #joGIw
return m_index == bitIt.m_index; <]r.wn=}M
} `7zz&f9dDX
bool operator!=(bit_iterator<Container>& bitIt) (Eq0 |"cj
{ ,[71,zs
return !(*this == bitIt); WoHFt*e2
} <.s=)}'`P
protected: Iw(deD
Container* m_container; g7res
private: %3M(!X:[
int m_size; $?YRy_SI
int m_index; JV=d!Gi[C
}; (1T2?mO
,ilVt
用该迭代器可以将任意类型对象以二进制格式输出: aT$q1!U`j2
double a = 10; ]1>U@oK
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));