以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 DmXcPJ[9
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 @aQ1khEd
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 pT?Q#,fh
象当作char数组来处理。 yL;M"L
template<class Container> c9R5w.t:
class bit_iterator : public std::iterator<bidirectional_iterator_tag, UpXz&k
void, void> w&4~Q4
{ y7KzW*>g:
public: ]|_\xO(
explicit bit_iterator(Container& c) : m_container(&c) yqSs,vz
{ Tz2-Bp]h
m_size = 8*sizeof(Container); X7L8h'(@
m_index = 0; OT^%3:zg
} B3Jgd,[
explicit bit_iterator() : m_container(0) 6Es?
MW=
{ T32BnmB{
m_size = 8*sizeof(Container); y2O4I'/5<
m_index = m_size; kt4d;4n
} =h(W4scgqX
bool operator* () h;5LgAY|v
{ qo)?8kx>l
char mask = 1; 3D9!M-
char* pc = (char*)m_container; Pmi#TW3X
int i = (m_size-m_index-1)/8; = 07Gy, =i
int off = (m_size-m_index-1)%8; (;VVCAoy
mask <<=off; `Q+moX
return pc & mask; &'l>rD^o
} -T6(hT\
bit_iterator<Container>& operator++() CIjZG ?A
{ ND<!4!R^
m_index++; 8@NH%zWBp
return *this; :Q+5,v-c
} :|o<SZ
bit_iterator<Container>& operator++(int) kP xa7
{ #k3t3az2{
m_index++; 4'KOpl
K
return *this; [P|[vWO
} jkiTj~WE-
bool operator==(bit_iterator<Container>& bitIt) I8OD$`~*U6
{ uS&|"*pR
return m_index == bitIt.m_index; /yLZ/<WN
} 6 \B0^
bool operator!=(bit_iterator<Container>& bitIt) @DW[Z`X
{ 2cu#lMq
return !(*this == bitIt); 5 ,0d
} N8KQz_]9I
protected: @`FCiH M
Container* m_container; fAZiC+
private: )'l*Tl
int m_size; A?G IBjs
int m_index; 4`#F^2r!
}; ?)'~~@NkH
39{{7(hh
用该迭代器可以将任意类型对象以二进制格式输出: Qr#1 u
double a = 10; k7tYa;C
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));