以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 KL$> j/qT
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 *kcc]*6@s
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 6~x a^3G:
象当作char数组来处理。 tD4-Llj6
template<class Container> 5".bM8o
class bit_iterator : public std::iterator<bidirectional_iterator_tag, @.`k2lxGd~
void, void> )<qL8#["U
{ [jrfh>v
public: }}k*i0
explicit bit_iterator(Container& c) : m_container(&c) 5u3KL
A
{ wSPmiJ/!
m_size = 8*sizeof(Container); i'\-Y]?[
m_index = 0; f.uy;v
} O\)Kg2
explicit bit_iterator() : m_container(0) 9vSKIq
{ /XU=l0u
m_size = 8*sizeof(Container); S(CVkCP
m_index = m_size; NytodVZ'3
} 1GB]Yi[>
bool operator* () q03+FLEfC
{ # s7e/GdKb
char mask = 1; T8x8TN"
char* pc = (char*)m_container; 1kR. .p<"
int i = (m_size-m_index-1)/8; IM5[O}aq
int off = (m_size-m_index-1)%8; g:GywXW
mask <<=off; ZSyXzop
return pc & mask; |f!J-H)
} iyXd"O
bit_iterator<Container>& operator++() &xGpbJG
{ #M5d,%?+#[
m_index++; 5?([jAOf
return *this; H4j1yD(d
} #9~,d<H
bit_iterator<Container>& operator++(int) }X/YMgJ
{ _6'@#DN
m_index++; 5UG9&:zu'V
return *this; ]lqZ9rO
} P ?nk>
bool operator==(bit_iterator<Container>& bitIt) gsl_aW!
{ ;%^{Zybh
return m_index == bitIt.m_index; !hHX8TD^J
} 0,Ib74N'w
bool operator!=(bit_iterator<Container>& bitIt) .yFO]
r1aL
{ KWAd~8,mk
return !(*this == bitIt); }[h]z7e2S
} Z:es7<#y
protected: XXA]ukj;r
Container* m_container; o=K9\ l
private: G6G-qqXy6
int m_size;
]qu6/Z
int m_index; Fw
t
}; c\&;Xr
\sfc!5G
用该迭代器可以将任意类型对象以二进制格式输出: '> n&3`r5
double a = 10; 0CK
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));