以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 f 6q@
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 x6,RW],FGR
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 %:y-"m1\u$
象当作char数组来处理。 YMWy5 \
template<class Container> +)Ty^;+[1
class bit_iterator : public std::iterator<bidirectional_iterator_tag, YT_kMy>
void, void> &F:7U!
{ 2vXMrh\
public: 3.jwOFH$
explicit bit_iterator(Container& c) : m_container(&c) LDNpEX~
{ J+TYm%A;-
m_size = 8*sizeof(Container); Qknd ^%
m_index = 0; QIw.`$H+
} aql*@8
)m
explicit bit_iterator() : m_container(0) r*g _
{ ;)kBJ @
m_size = 8*sizeof(Container); 2P|-V} ;9
m_index = m_size; yG_#>3sD+%
} s:_5p`w>
bool operator* () jIl-}/2
{ x:2_FoQ
char mask = 1; BgRiJFa.d[
char* pc = (char*)m_container; Z+}SM]m
int i = (m_size-m_index-1)/8; KGJB.<Be
int off = (m_size-m_index-1)%8; lz( 9pz
mask <<=off; wEp/bR1=
return pc & mask; 6Q`ce!~$
} \-B>']:R4
bit_iterator<Container>& operator++() JdAjKN
{ zL|^5p`K
m_index++; )SQ g
return *this; 4qMHVPJv\
} ge`J>2
bit_iterator<Container>& operator++(int) ZN?(lt)u9
{ #4Z$O(
m_index++; irm8z|N-
return *this; YK- R|z6K
} i^>
RjR
bool operator==(bit_iterator<Container>& bitIt) WP>O7[|
{ / [19ITZ
return m_index == bitIt.m_index; #B?7{#.1
} MVCCh+,GI
bool operator!=(bit_iterator<Container>& bitIt) C+iP
@~
{ }[Y):Yy
return !(*this == bitIt); X4TUi8ht!]
}
2O
protected: uZ^i8;i
Container* m_container; L`!sV-.
private: nMnc&8r
int m_size; K%g\\uo
int m_index; OlK2<<
}; |EApKxaKD
A~6 Cs
用该迭代器可以将任意类型对象以二进制格式输出: (-#{qkA
double a = 10; +`+a9+=
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));