以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 S+ ^E.
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 Yr=Y@~ XL
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 Q7COQ2~K
象当作char数组来处理。 \<6CZ
template<class Container> ">jj
class bit_iterator : public std::iterator<bidirectional_iterator_tag, nSAdCJ;4
void, void> .JiziFJ@mj
{ fku<,SV$O4
public: n`&U~s8w
explicit bit_iterator(Container& c) : m_container(&c) j;iAD:nf
{ =-lb)Z"d
m_size = 8*sizeof(Container); )$bS}.
m_index = 0; P &e\)Z|
} be^6i:
explicit bit_iterator() : m_container(0)
2WVka
{ FA3~|Zg
m_size = 8*sizeof(Container); *6F[t.Or
m_index = m_size; fG(SNNl+D
} K$_0`>[
bool operator* () #@~+HC=
{ |(LZ9I
char mask = 1; {"QNJq#:
char* pc = (char*)m_container; K_ ~"}
int i = (m_size-m_index-1)/8; !pdb'*,n
int off = (m_size-m_index-1)%8;
oVfLnI;
mask <<=off; z(^]J`+\
return pc & mask; ,.1Psz^U
} G&V/Gj8
bit_iterator<Container>& operator++() Hi1JLW,
{ Z%/=|[9i
m_index++; &&:YVd
return *this; QTXt8I
} 4'A!; ]:
bit_iterator<Container>& operator++(int) DOJ N2{IP
{ 9!}8UALD
m_index++; B%76rEpvW;
return *this; Rt!FPoN,y
} usCt#eZK
bool operator==(bit_iterator<Container>& bitIt) .1Al<OLL
{ (l-ab2'
return m_index == bitIt.m_index; ?fjuh}Q5h
} q):5JXql~
bool operator!=(bit_iterator<Container>& bitIt) Ww%=1M]e-
{ sN2p76KN
return !(*this == bitIt); DBD%6o>]K
} q~ZNd3O
protected: Y
M\ K%rk
Container* m_container; _i|t
Y4L
private: % <*g!y `
int m_size; 7KL v6]b
int m_index; *b/`Ya4
}; Dq5j1m.
DN~nk
用该迭代器可以将任意类型对象以二进制格式输出: SB|Qa}62
double a = 10; 2fR02={-
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));