以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 AW68'G*m
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 I%xJ)fIK
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 c>.X c[H
象当作char数组来处理。 f
d5~'2
template<class Container> X|G+N(`|(
class bit_iterator : public std::iterator<bidirectional_iterator_tag, Ry3 f'gx
void, void> 9B0"GEwrs
{ [hbIv
public: pQ8+T|0x
explicit bit_iterator(Container& c) : m_container(&c) GrC")Z|3u
{ 7C^ nk
z
m_size = 8*sizeof(Container); OSk9Eb4ld
m_index = 0; h (2k;M^s
} gp2)35
explicit bit_iterator() : m_container(0) {*Pp^r
{ ![%,pip2/&
m_size = 8*sizeof(Container); b"9,DQB=i
m_index = m_size; N4-J !r@#~
} ,iUx'U
bool operator* () 4pv:u:Z
{ #m>mYp8E.5
char mask = 1; q5PYc.E([
char* pc = (char*)m_container; 3}Qh`+Yj]
int i = (m_size-m_index-1)/8; K4~Ox
int off = (m_size-m_index-1)%8; 5Bo)j_Qo
mask <<=off; Fwqf4&/
return pc & mask; qI@_
} q#Vf2U55m
bit_iterator<Container>& operator++() O!tD1^O!1}
{ :_ox8xS4
m_index++; lsCh K
return *this; gZv<_0N
} Hc9pWr"N
bit_iterator<Container>& operator++(int) EVsZ:Ra^k
{ t;3.;
m_index++; Y[4B{
return *this; ow"Xv
} ;0'v`ob'.?
bool operator==(bit_iterator<Container>& bitIt) Z
ngJ9js
{ UepBXt3)
return m_index == bitIt.m_index; +_Z/VQv
} _!zY(9%
bool operator!=(bit_iterator<Container>& bitIt) 3FN? CN] O
{ 3LREue7Gr
return !(*this == bitIt); RSC-+c6 1
} _(foJRr
protected: s=4.Ovd\
Container* m_container; +&@0;zSga
private: UEUTu}4y
int m_size; eHR<(8c'f
int m_index; pJ[Q.QxU
}; iXFaQ
9K!='u`
用该迭代器可以将任意类型对象以二进制格式输出: .2xkf@OP
double a = 10;
2X_ef
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));