以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 rifxr4c[X>
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 O+$70
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 MocH>^,
象当作char数组来处理。 &1{k^>oz
template<class Container> l1[IXw?
class bit_iterator : public std::iterator<bidirectional_iterator_tag, ("6W.i>
void, void> H-W)Tq_?-
{ yd~fC:_ ]
public: t;]egk
explicit bit_iterator(Container& c) : m_container(&c) bM-Rj1#Lo
{ s*f.` A*)
m_size = 8*sizeof(Container); 12a #]E
m_index = 0; (`u!/
}
R'/wOE2
explicit bit_iterator() : m_container(0) %},gE[N!J
{ {+:XVT_+
m_size = 8*sizeof(Container); &>{>k<z
m_index = m_size; sdWl5 "
} ar|[D7Xrq\
bool operator* () \gkajY-?
{ yh:,[<q
char mask = 1; cZ >W8{G
char* pc = (char*)m_container; L'Zud,JKg
int i = (m_size-m_index-1)/8; 3c3Z"JV
int off = (m_size-m_index-1)%8; ^j %UZ
mask <<=off; Yn>zR I
return pc & mask; obq}#
} =@ZtUjcJx
bit_iterator<Container>& operator++() O| ]Ped9
{ W6T&hB
m_index++; s>\g03=
return *this; 6~ `bAe`}
} [u80-x<
bit_iterator<Container>& operator++(int) (do=o&9pm
{ Ak Tw?v'
m_index++; H\mVK!](D
return *this; %#9 ~V
} EC'bgFe
bool operator==(bit_iterator<Container>& bitIt) 0Q >|s_
{ %Z yPK,("
return m_index == bitIt.m_index; 1,QZnF!.x
} 29^bMau)v
bool operator!=(bit_iterator<Container>& bitIt) 3L?a4,Q"k}
{ GuWBl$|+b
return !(*this == bitIt); Ba0D"2CgY
} yXx62J
protected: PEEY;x
Container* m_container; bOMP8{H,
private: "S`wwl
int m_size; ZPao*2xz
int m_index; L0b]^_tI
}; QV$dKjMS
Vor9
?F&w
用该迭代器可以将任意类型对象以二进制格式输出: IGT_
5te
double a = 10; 7RE6y(V1
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));