以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 {#U3A_y
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 @{V bu
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对
:d)y
象当作char数组来处理。 ag02=}Q'r
template<class Container> RwyX,|
class bit_iterator : public std::iterator<bidirectional_iterator_tag, *TyLB&<t
void, void> 9@3cz_[J
{ " i!Xiy~
public: omu)s
'8
explicit bit_iterator(Container& c) : m_container(&c) y
<] x
{ XU5GmGu_+
m_size = 8*sizeof(Container); W6^YFN
m_index = 0; 4"^v]&I
} 7ILb&JQ!%{
explicit bit_iterator() : m_container(0) JfLoGl;pm
{ .(g"(fgF
m_size = 8*sizeof(Container); nG4}8
m_index = m_size; }kZ)|/]kn
} i K,^|Q8
bool operator* () |\BxKwS^
{ \DMZ M
char mask = 1; IRG -H!FV
char* pc = (char*)m_container; .dPy<6E
int i = (m_size-m_index-1)/8; T/$hN hQK
int off = (m_size-m_index-1)%8; 1c4@qQyo
mask <<=off; ]5a,%*f+
return pc & mask; NTV@,
} 8," 5z_
bit_iterator<Container>& operator++() wX+KW0|>
{ 4Ai#$SHLm
m_index++; wl5+VC*l0
return *this; 0zc~!r~
} |C`.m|
bit_iterator<Container>& operator++(int) wOV}<.W
{ #-7w|
m_index++; \5DOp-2
return *this; x5(B(V@b
} \Xpq=2`
bool operator==(bit_iterator<Container>& bitIt) 0eFvcH:qG
{ } m&La4E
return m_index == bitIt.m_index; FA$1&Fu3Y
} St|B9V?eEB
bool operator!=(bit_iterator<Container>& bitIt) Jty/gjK+
{ eh /QFm
4
return !(*this == bitIt); d>hLnz1O
} w$$vR
protected: snvixbN
Container* m_container; ' Ivr =-
private: _ lE
d8Cb
int m_size; dkAY%z two
int m_index; T{4Ru6[
}; u(C?\HaH
"yf#sEabV
用该迭代器可以将任意类型对象以二进制格式输出: \9%RY]TK3
double a = 10; [DSD[[
z[
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));