以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 LPm# 3U
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 ]cGz~TN~
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 #K,qF*
象当作char数组来处理。 pb2{J#
template<class Container> z"P,=M6De
class bit_iterator : public std::iterator<bidirectional_iterator_tag, Gad2EEZ%0
void, void> [&O:qaD^
{ b1['uJF
public: Ow .)h(y/
explicit bit_iterator(Container& c) : m_container(&c) Ppo^qb
{ ,ovv
m_size = 8*sizeof(Container); (J;zk b
m_index = 0; g ]PLW3
} fE7a]REK
explicit bit_iterator() : m_container(0) Rcx'a:k
{ /K<GN7vN
m_size = 8*sizeof(Container); gkq RO19
m_index = m_size; Xw}Y!;<IEu
} OSh mrz28
bool operator* () C4SD
{ as\K(c9
char mask = 1; HV.|Eh_7
char* pc = (char*)m_container; 52C-D+zCJ
int i = (m_size-m_index-1)/8; ~bWWu`h
int off = (m_size-m_index-1)%8; Z$m2rZ#
mask <<=off; x8rFMR#S=
return pc & mask; Tdmo'"m8z_
} }AH|~3|D
bit_iterator<Container>& operator++() r|H!s,
{ 3TvhOC>yG
m_index++; Fi3(glgd-
return *this; ht74h
} d&R\7)0
bit_iterator<Container>& operator++(int) 7J!d3j2TR
{ g]#zWTw(
m_index++; 8wx#,Xa
return *this; =iN_Ug+
} vJjj+:
bool operator==(bit_iterator<Container>& bitIt) [\%t<aa
{ #O974f8
return m_index == bitIt.m_index; Z We$(?
} -_f0AfU/a
bool operator!=(bit_iterator<Container>& bitIt) #uw*8&%0
{ fdEj#Ux<H
return !(*this == bitIt); g:e8i~
} K|J#/
protected: @j8L{FGnN
Container* m_container; &7kSLat+9{
private: 96V, [-arf
int m_size; 3SB7)8Id1
int m_index; /z- C
:k\
}; HE<%d
r- "`Abev
用该迭代器可以将任意类型对象以二进制格式输出: jw%FZ
double a = 10; #FDu4xi
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));