以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 M2piJ'T4u
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 \(`,z}Ht _
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 mt]50}eK
象当作char数组来处理。 ?(E?oJ)(
template<class Container> jU!ibs}R3
class bit_iterator : public std::iterator<bidirectional_iterator_tag, t6! B
void, void> GK[[e~#u
{ nna boD
public: [WN2ZQ
explicit bit_iterator(Container& c) : m_container(&c) WF`
{ 2|D<0d#W
m_size = 8*sizeof(Container); ,.TwM;w=
m_index = 0; #)z7&nD
} fk'DJf[M
explicit bit_iterator() : m_container(0) Q|tzA10E
{ :,pdR>q%(y
m_size = 8*sizeof(Container); ku^0bq}BrH
m_index = m_size; CQI\/oaO
} o0#zk
bool operator* () ~NZ}@J{00_
{ 7~2V5@{<
char mask = 1; 2O
"
~k
char* pc = (char*)m_container;
dEK bB
int i = (m_size-m_index-1)/8; ,Lr}P
int off = (m_size-m_index-1)%8; G4QsR7
mask <<=off; mExJ--}
return pc & mask; #bCzWg
} ea6`%,lF~
bit_iterator<Container>& operator++() f (ug3(j
{ 0*50uK=5
m_index++; Azag*M?
return *this; G[s/M\l
} yCZ[z
A
bit_iterator<Container>& operator++(int) x_OZdI
{ :Nl.< 6+
m_index++; +9]CGYj
return *this; /A>1TPb09"
} sp&g
bool operator==(bit_iterator<Container>& bitIt) XE?,)8
{ 3 ,
nr*R!
return m_index == bitIt.m_index; X,ok 3c4X
} "xp>Vj
bool operator!=(bit_iterator<Container>& bitIt) *%jd>e7d
{ AN4(]_]
return !(*this == bitIt); LT6VZ,S
} %)PQomn?
protected: e|Mw9DIW
Container* m_container; $X]Z-RCK3
private: R*>EbOuI
int m_size; Yy4l -} "
int m_index; 7U`8W\-
}; PLs(+>H
Ujfs!ikh&F
用该迭代器可以将任意类型对象以二进制格式输出: -< }#ImTN
double a = 10; N7}yU~j^
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));