以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 mYRsM s
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 p?idl`?^3
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 ih\=mB
象当作char数组来处理。 ra]lC7<H
template<class Container> 15dbM/Gj
class bit_iterator : public std::iterator<bidirectional_iterator_tag, WMk;-,S!)
void, void> `"RT(` m
{ LEn+0^hX
public: ?j^:jV
explicit bit_iterator(Container& c) : m_container(&c) [==x4Nb
{ K?$|Y-_D^M
m_size = 8*sizeof(Container); U,7O{YM
m_index = 0; 4Uzx2
} 2, R5mL$
explicit bit_iterator() : m_container(0) `-)Hot)
{ 1n-+IR"
m_size = 8*sizeof(Container); .sBwJZ
m_index = m_size; W^8MsdM
} gT0N\oU"
bool operator* () bZf}m=C!
{ W^" C|4G }
char mask = 1; 1wTPT,k
char* pc = (char*)m_container; $z
\H*
int i = (m_size-m_index-1)/8; )8@|+'q
int off = (m_size-m_index-1)%8; ~Kiu"
g
mask <<=off; f2.|[
return pc & mask; .d;|iwl
} /O{iL:`
bit_iterator<Container>& operator++() 'J1!P:tJ
{ )1iqM]~;B
m_index++; mnm7{?#[
return *this; IDn$w^"
} mi'3ibCG
bit_iterator<Container>& operator++(int) ~/m=Q<cV
{ E=$li
m_index++; Mo4k6@ht_
return *this; 45aFH}w:
} ApSzkPv*
bool operator==(bit_iterator<Container>& bitIt) 4qvE2W}&
{ ZgI ?#e
return m_index == bitIt.m_index; Y:#nk.}>
} kT1 2
bool operator!=(bit_iterator<Container>& bitIt) Dhze2q)o
{ Ra)AQ
n
return !(*this == bitIt); Zp qb0ro
} S17 c#6vT
protected: ^_5t5>
Container* m_container; PW QRy
private: MiN|u
int m_size; kR/Etm5_
int m_index; 3;Y9<
}; OYLg-S
L&LAh&%{2
用该迭代器可以将任意类型对象以二进制格式输出: _2~+%{/m,
double a = 10; 5lrjM^E|
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));