以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 Al;oI3
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 ?v*7!2;
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 4C*=8oe_
象当作char数组来处理。 nqW:P$
template<class Container> Q/SC7R&"t
class bit_iterator : public std::iterator<bidirectional_iterator_tag, 6R,b 8
void, void> YuuG:Kk
{ [Cr~gd+q
public: 8-#2?=
explicit bit_iterator(Container& c) : m_container(&c) *y$r y]
{ E^ti!4{<
m_size = 8*sizeof(Container); \?IwR]@y
m_index = 0; \Xp"I5
} {N`<e>A]{
explicit bit_iterator() : m_container(0) +=xRr?F
{ f@X*Tlx^|
m_size = 8*sizeof(Container); _\6(4a`,
m_index = m_size; M?CMN.Dw
} ph+tk5k
bool operator* () tOVm~C,R
{ 0(6`dr_
char mask = 1; gx.]4v
char* pc = (char*)m_container; 3Q"+
#Ob
int i = (m_size-m_index-1)/8; Tj~#Xc
int off = (m_size-m_index-1)%8; smS0Rk
mask <<=off; M)RQIl5
return pc & mask; Q2PwO;E.`C
} NGzqiu"J
bit_iterator<Container>& operator++() {iteC
{ 1Ac1CsK*
m_index++; g0$k_
return *this; f@g
} n#,l&Bx
bit_iterator<Container>& operator++(int) u{d`
{ (pg9cM]NA
m_index++; (LPc\\Vv
return *this; b
DvbM
} eF\C?4
bool operator==(bit_iterator<Container>& bitIt) <5^(l$IBj
{ 2geC3v% 0o
return m_index == bitIt.m_index; Hvk?(\x
} 2J;CiEB
bool operator!=(bit_iterator<Container>& bitIt) Z}f_\d'
{ B\yq%m
return !(*this == bitIt); V0(ABi:d
} 1\kehCt
protected: u'."E7o#
Container* m_container; GC3L2C0)k
private: 8B9zo&
int m_size; 4Fq}*QJ-
int m_index; 3I(M<sB}
}; n-Y'LK40Os
0&~u0B{
用该迭代器可以将任意类型对象以二进制格式输出: >c eU!=>
double a = 10; 3!W&J
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));