以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 dilom#2l
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 j:>_1P/
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 ovXU +8
象当作char数组来处理。 K`vc&uf
template<class Container> d94Le/E
class bit_iterator : public std::iterator<bidirectional_iterator_tag, tg~@(IT}j
void, void> nhdOo
{ /}kG$~
public: qdCcMcGt
explicit bit_iterator(Container& c) : m_container(&c) Q4R*yRk
{ ye^*Z>|
m_size = 8*sizeof(Container); * "qS
m_index = 0; 1-=ZIHW
} KkJrh@lk
explicit bit_iterator() : m_container(0) 93[&'
{ *DUP$@}k
m_size = 8*sizeof(Container); =:"wU
m_index = m_size; gVscdg5
} je#OV,uHM
bool operator* () UFSbu5 j
{ uB@~x Q_V
char mask = 1; v?
Ufx
char* pc = (char*)m_container; }mdk+IEt
int i = (m_size-m_index-1)/8; ,'Sj:l
int off = (m_size-m_index-1)%8; 63PSYj(y
mask <<=off; ^0tO2$
return pc & mask;
}N0$DqP
} xQ0.2[*5
bit_iterator<Container>& operator++() Y
n7z#bu
{ rgw@
m_index++; jY1^I26E
return *this; S.,5vI"s,
} JYw_Z*L=m
bit_iterator<Container>& operator++(int) PP-U.
{ fMm.V=/+
m_index++; +bDBc?HZ{$
return *this; [X"pOz
} ^B?brH}
bool operator==(bit_iterator<Container>& bitIt) M 8NWQ^Y
{ dJ(<zz+;b
return m_index == bitIt.m_index; j;yKL-ycB
} r
"uQ|
bool operator!=(bit_iterator<Container>& bitIt) L/c`t7
{ =@ d/SZ|(E
return !(*this == bitIt); `8lS)R!
} P
y!$r
protected: `e[>S
Container* m_container; s1>d)2lX
private: %'w?fqk
int m_size; PpLuN12H
int m_index; OK" fFv
}; <~teD[1k"
SVn $!t
用该迭代器可以将任意类型对象以二进制格式输出: q|ZzGEj:OV
double a = 10; +~n4</
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));