以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 ,}|V'y
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 TX+t
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 9,>M/_8>
象当作char数组来处理。 #M>E{w9
template<class Container> bQeYFY#^
class bit_iterator : public std::iterator<bidirectional_iterator_tag, ~,guw7F
void, void> "yz@LV1
{ ~g,QwaA[
public: rLXn35O
explicit bit_iterator(Container& c) : m_container(&c) h7w<.zwu
t
{ U!`'Qw;
m_size = 8*sizeof(Container); ]f c:CR
m_index = 0; q>X:z0H
} \ lKQ'_
explicit bit_iterator() : m_container(0) <;T7qEIlo
{ @kK=|(OB'
m_size = 8*sizeof(Container); JjCf<ktE.
m_index = m_size; *w6N&
} PDsLJ|:yL
bool operator* () N1-LM9S
{
Ay`a>:p
char mask = 1; <wA_2S
Y
char* pc = (char*)m_container; Jzj~uz
int i = (m_size-m_index-1)/8; bpILiC
int off = (m_size-m_index-1)%8; N?Z?g_a8
mask <<=off; !6%mt} h
return pc & mask; @rF\6I
} u`~{:V
bit_iterator<Container>& operator++() GhT7:_r~
{ th<]L<BP/
m_index++; CNz[@6-cYU
return *this; aD^MoB3
} @88 efF
bit_iterator<Container>& operator++(int) e{O5y8,
{ :Ry24X
m_index++; {V&7JZl,/
return *this; c%dy$mkqgK
} gdT_kb5HL8
bool operator==(bit_iterator<Container>& bitIt) vP2QAGk<
{ I6fpXPP).
return m_index == bitIt.m_index; WWLVy(
} ?x0yiV~dL
bool operator!=(bit_iterator<Container>& bitIt) 2uTa}{/%
{ QUDVsN#
return !(*this == bitIt); Ss:,#|
} +g[B &A!d+
protected: )-{~7@yqZ
Container* m_container; >KPJ74R
private: ]4yvTP3[Rm
int m_size; O+$70
int m_index; O /&%`&2
}; a< EC]-nw
Uu+C<j&-
用该迭代器可以将任意类型对象以二进制格式输出: M&FuXG%
double a = 10; |gz,Ip{
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));