以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 ;,A\bmC
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 k
Z3tz?Du
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 ;4_n:XUgo;
象当作char数组来处理。 ~J2Q0Jv
template<class Container> 9qW,I|G
class bit_iterator : public std::iterator<bidirectional_iterator_tag, X%-4x
void, void> WIGb7}egR
{ t!=S[
public: <7&b|f$CL
explicit bit_iterator(Container& c) : m_container(&c) k@Tt,.];
{ "_l[4o[D
m_size = 8*sizeof(Container); 0PfFli`2;
m_index = 0; @<PL
} +|?c_vD
explicit bit_iterator() : m_container(0) |s^ar8)=)
{ >r*Zm2($MR
m_size = 8*sizeof(Container); s=nds"J
m_index = m_size; c1<g!Q&E
} 7/1S5yUr|
bool operator* () ?~K2&eo
{ :U*[s$
char mask = 1; fr?eOigbl
char* pc = (char*)m_container; 'I~dJEW7
int i = (m_size-m_index-1)/8; MQ+ek4
int off = (m_size-m_index-1)%8; 5R Hs
mask <<=off; }Q=Zqlvz
return pc & mask; f
LW>-O73
} Vg+SXq6G
bit_iterator<Container>& operator++() ZJpI]^9|
{ lV
9q;!/1
m_index++; CL*%06QyE
return *this; 9mnON~j5
} |l|]Tw
bit_iterator<Container>& operator++(int) xH0/R LK3J
{ xki"'
m_index++; ,*4"d._Y
return *this; NLpD,q{
} G#V22Wca8
bool operator==(bit_iterator<Container>& bitIt) >H1d9y+Z
{ s`B'vyoaa
return m_index == bitIt.m_index; ?*@h]4+k'
} dF,FH-
bool operator!=(bit_iterator<Container>& bitIt) 5^dw!^d
{ C;5}/J^E
return !(*this == bitIt); 1fy{@j(W
} UE4#j\
protected: pUr[MnQLf
Container* m_container; 7" [;M
private: LZVO9e]
int m_size; x\DkS,O
int m_index; ' 7A7HDJ
}; 0o]K6b
>+#[O"
用该迭代器可以将任意类型对象以二进制格式输出: JW\"S
double a = 10; +Xp;T`,v
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));