以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 [}X|&`'i
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 F /b`[
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 X>%nzY]m
象当作char数组来处理。 3P>gDQP
template<class Container> _`$LdqgE
class bit_iterator : public std::iterator<bidirectional_iterator_tag, )vr@:PE
void, void> J(
}2Ua_
{ @u3`lhUcT
public: 6 Z/`p~e
explicit bit_iterator(Container& c) : m_container(&c) ;`9f<d#\
{ 1C[9}}
m_size = 8*sizeof(Container); y!e]bvN
m_index = 0; <G"cgN#]
} bRC243]g*A
explicit bit_iterator() : m_container(0) OfsP5*d
{ od;-D~
m_size = 8*sizeof(Container); JuRoeq.
m_index = m_size; 'Pz%c}hJ
} ]AP1+
&9fN
bool operator* () GnV0~?
{ <?jdNM
char mask = 1; 93-Y(Xx)bY
char* pc = (char*)m_container; ~m%[d.
}e
int i = (m_size-m_index-1)/8; yev!Nw
int off = (m_size-m_index-1)%8; V la,avON
mask <<=off; 2`yhxO
return pc & mask; x"W~m.y$h
}
K
+7
bit_iterator<Container>& operator++() e4X
df>B
{ N&8TG
m_index++; HN47/]"*
return *this; WxdQ^#AE
} )cfi@-J+#
bit_iterator<Container>& operator++(int) g14*6O:
{ #kg`rrFr
m_index++; Pms@!yce
return *this; ^<]'?4m]
} R^Rc!G}
bool operator==(bit_iterator<Container>& bitIt) `i{d"H0E
{ fBO/0uW
return m_index == bitIt.m_index; r4.6W[|d
} T&U}}iWN
bool operator!=(bit_iterator<Container>& bitIt) Re%[t9F&
{ Gk;YAI
return !(*this == bitIt); ia6 jiW x
} , ,3lH-C
protected: PN}+LOD<t
Container* m_container; 0V%c%]PH
private: ^5 >e
int m_size; U}v`~'K
int m_index; 2:+8]b 3i
}; 2 a<\4w'
3WV(Ok
用该迭代器可以将任意类型对象以二进制格式输出: rK~-Wzwu
double a = 10; *0WVrM06?
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));