以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 FSAX,Y
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 (|rf>=B+H
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 ]f&f_"D
象当作char数组来处理。 >d
*`K
template<class Container> xSNGf@1b
class bit_iterator : public std::iterator<bidirectional_iterator_tag, c!'\k,ma<9
void, void> &I(\:|`o
{ qxsHhyB_n;
public: BW}M/
explicit bit_iterator(Container& c) : m_container(&c) 'W>y v
{ <RZqs
m_size = 8*sizeof(Container); #f HnM+
m_index = 0; +8x_f0<
} DvB{N`COd
explicit bit_iterator() : m_container(0) RA;/ ?l
{ -sZb+2tDa
m_size = 8*sizeof(Container); G%AO%II
m_index = m_size; EWgJ"WTF
} A~lc`m-
bool operator* () E*wG5]at
{ #z<#oC5
char mask = 1; EtaKo}!A}
char* pc = (char*)m_container; ! K_<hNG&
int i = (m_size-m_index-1)/8; q-ko)]
int off = (m_size-m_index-1)%8; he:z9EG}
mask <<=off; Xo]2iQy
return pc & mask; `wQs$!a
} }f14# y;
bit_iterator<Container>& operator++() xkax
{ G6}&k[d5%
m_index++; DwZRx@
return *this; URg;e M#
} :#35mBe}k
bit_iterator<Container>& operator++(int) w0lgB%97p
{ (Y8LyY
m_index++; =QbOvIq
return *this; nE*S3
} p<#aXs jy
bool operator==(bit_iterator<Container>& bitIt) LExm#T`
{ !{+.)%d'g
return m_index == bitIt.m_index; '`.-75T
} ,\c V,$
bool operator!=(bit_iterator<Container>& bitIt) i$Kx@,O8t
{ CCol>:8{P
return !(*this == bitIt); JbS[(+o
} O9/)_:Wdh
protected: .{*l,
Container* m_container; M\
private: -!\%##r7~
int m_size; P=KhR&gwV~
int m_index; x<Gjr}
}; NN1}P'6Ha
nqo1+OR
用该迭代器可以将任意类型对象以二进制格式输出: :KA)4[#;W
double a = 10; ) \T H'
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));