以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 ^EU&6M2
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 01I5,Dm
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 ]7kq@o/7
象当作char数组来处理。 ;cZ9C 1
template<class Container> jeb<qi>
class bit_iterator : public std::iterator<bidirectional_iterator_tag, 2L.UEAt
void, void> Q6?+# }
{ g#FqjE|mx
public: uF5d
]{Qt
explicit bit_iterator(Container& c) : m_container(&c) 2^Gl;3
{ +T[3wL~
m_size = 8*sizeof(Container); @t`|w.]ml
m_index = 0; nut;ohIh
} {(G@YG?
explicit bit_iterator() : m_container(0) %o<&O(Y
{ #FF5xe
m_size = 8*sizeof(Container); 9Vk61x6
m_index = m_size; R7T"fN
} %kD WUJZ
bool operator* () E*Vx^k$
{ YlOYgr^
char mask = 1; 4@#1G*OO
char* pc = (char*)m_container; k1>%wR
int i = (m_size-m_index-1)/8; {npKdX
int off = (m_size-m_index-1)%8; aA%$<ItH
mask <<=off; >rlQY>5pH
return pc & mask; "%ag^v9
} L.(T"`-i
bit_iterator<Container>& operator++() ^8)&~q*
{ :YjOv
m_index++; pPCxa#OV
return *this; $V?zJ:a>L
} T,(IdVlJ
bit_iterator<Container>& operator++(int) Rz`<E97-
{ 93fKv
m_index++; `u:U{m
return *this; #c4LdZu9
} ;3\Fb3d
bool operator==(bit_iterator<Container>& bitIt) Szi4M&!K
{ f4s[R0l
return m_index == bitIt.m_index; QHr
3J
} DLyHC=%{+h
bool operator!=(bit_iterator<Container>& bitIt) ;~z>GJox
{ 8s8q`_.)(
return !(*this == bitIt); uW;Uq=UN
} =B1t?("
protected: h0n0Dc{4
Container* m_container; k_V1x0sZ
private: ,Z_nV+l_
int m_size; |NtT-T)7
int m_index; 8!>uC&bE8
}; DS>s_3V
M;zRf3S
用该迭代器可以将任意类型对象以二进制格式输出: D]y6*Ha
double a = 10; KGi@H%NN
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));