以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 *Ii_dpJ
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 qzD<_ynA
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 5Fa.X|R~
象当作char数组来处理。 Fq\vFt|m<
template<class Container> S"+X+Oxp7?
class bit_iterator : public std::iterator<bidirectional_iterator_tag, jroR2*
void, void> 0;9X`z
J
{ 5=Cea
public: r ]JV!'R
explicit bit_iterator(Container& c) : m_container(&c) jpijnz{M
{ BN??3F8C
m_size = 8*sizeof(Container);
i+r h&,
m_index = 0; GH ]c
} [t#xX59
explicit bit_iterator() : m_container(0) 8NCu;s
{ 66ULR&D8
m_size = 8*sizeof(Container); M&au A
m_index = m_size; fCC^hB]'
} RLl*@SEi"
bool operator* () *K}h
>b 1
{ 8SH&b8k<<
char mask = 1; B?A]0S
char* pc = (char*)m_container; )b AO A
int i = (m_size-m_index-1)/8; xZbiEDU
int off = (m_size-m_index-1)%8; @`" UD
mask <<=off; a}(xZ\n^D;
return pc & mask; <5).(MTa
} 9BW"^$
bit_iterator<Container>& operator++() p1}umDb%
{ rjk{9u1a"
m_index++; G,o5JL"t
return *this; JK.<(=y\
} $W} YXLFj?
bit_iterator<Container>& operator++(int) 4WspPHj
{ 1nGpW$Gx
m_index++; Q`= ,&;T>
return *this; n:dnBwY
} f%#q}vK-
bool operator==(bit_iterator<Container>& bitIt) (rTn6[*
{ lqaOLZH
return m_index == bitIt.m_index; ,u.G6"<
} vG X
L'k
bool operator!=(bit_iterator<Container>& bitIt) &Ul8h,qw
{ o/dj1a~U
return !(*this == bitIt);
\\U,|}L .
} ULT,>S6r
protected: t[=-4;
Container* m_container; ^&[Z@*A8#
private: dMw7UJ
int m_size; xlKg0&D
int m_index; mCb1^Y
}; `2
6t+Tb
J_-K"T|f
用该迭代器可以将任意类型对象以二进制格式输出: {KQ]"a 6
double a = 10; >]dH1@@
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));