以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 0"-H34M<D
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 8<Nz34Y
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 daY0;,>
象当作char数组来处理。 HH*,Oe
template<class Container> ;[zZI~wh
class bit_iterator : public std::iterator<bidirectional_iterator_tag, vU/sQt8
void, void> 2+|r*2_glo
{ yyPj!<.MGP
public: 9U9ghWH8
explicit bit_iterator(Container& c) : m_container(&c) h1)+QLI
{ +vFqHfmP
m_size = 8*sizeof(Container); zv1,DnkqF
m_index = 0; b6 g9!
} uA?a
DjA
explicit bit_iterator() : m_container(0) Q0PqyobD
{ CE183l\
m_size = 8*sizeof(Container); u`L*
m_index = m_size; Ty 6 XU!
} I%?M9y.u6
bool operator* () Q1h v2*/U
{ 5W{|?l{
char mask = 1; 1^Q!EV
char* pc = (char*)m_container; acpc[^'
int i = (m_size-m_index-1)/8; <!u(_Bxw/
int off = (m_size-m_index-1)%8; B^1jd!m
mask <<=off; wMH13i3
return pc & mask; qztL M?iV
} L8;`*H
bit_iterator<Container>& operator++() e mq%"
;.
{ +SRM?av
m_index++; rI:]''PR
return *this; F7p`zf@O]
} a(U/70j
bit_iterator<Container>& operator++(int) QK~>KgVi
{ ^-}3+YA
m_index++; or`"{wop
return *this; bF@iO316H
} ~fA H6FdZ\
bool operator==(bit_iterator<Container>& bitIt) ,g)9ZP.F
{ 4_eFc$^
return m_index == bitIt.m_index; M+Y^ A7
} la!rg#)-X
bool operator!=(bit_iterator<Container>& bitIt) J0Y-e39 `
{ "jl`FAu)q
return !(*this == bitIt); =1kjKE !
} DB1Y`l
protected: dZbG#4oO
Container* m_container; ]_)=xF19
private: Z Q9's
int m_size; rNHV
int m_index; #lm1"~`5
}; -aMwC5iR@
u`X}AKC
用该迭代器可以将任意类型对象以二进制格式输出: UUql"$q
double a = 10; Y) 4D$9:
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));