以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 W2CCLq1(
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 0/".2(\}T
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 bVEt?E*+
象当作char数组来处理。 Ood8Qty(
template<class Container> K)m\xzT/
class bit_iterator : public std::iterator<bidirectional_iterator_tag, ?W l=F/
void, void> >"^H"K/T
{ %kM|Hk3d
public: [i7Ug.Oi"
explicit bit_iterator(Container& c) : m_container(&c) L
B:wo.X
{ J&%d(EJM
m_size = 8*sizeof(Container); U%2[,c_
m_index = 0; _wa1R+`_
} {fi:]|<1h
explicit bit_iterator() : m_container(0) W'f{u&<
{ Ey5E1$w%&
m_size = 8*sizeof(Container); ! }u'%
m_index = m_size; crV2T
} r^<W$-#
bool operator* () ?k$3( -
{ PCxv_Svf
char mask = 1; iqCZIahf
char* pc = (char*)m_container; <t9#~x#'b
int i = (m_size-m_index-1)/8; %_*q'6K
int off = (m_size-m_index-1)%8; B^W0Ik`m
mask <<=off; 3GkVMYI
return pc & mask; |Gc2w]\3
} RS'%;B-)
bit_iterator<Container>& operator++() p=T,JAI t
{ Ol8ma`}Nq3
m_index++; "xS?#^a
return *this; m791w8Vr
} 9UD~$_<\
bit_iterator<Container>& operator++(int) 2Z3c` /k
{ _7?LINF9
m_index++; &yFt@g]
return *this; ~(2G7x)
} &"v h=Z-
bool operator==(bit_iterator<Container>& bitIt) 9v_B$F$_T
{ 0E9LZOw4T
return m_index == bitIt.m_index; Mz}yf5{f
} XWQp-H.
bool operator!=(bit_iterator<Container>& bitIt) joa|5v'
{ >L6V!
return !(*this == bitIt); #q`-"2"|
} F\1{b N|3
protected: E|!rapa
Container* m_container; <a@'Pcsk
private: ;U6z|O7L
int m_size; \ "193CW!
int m_index;
Vj^<V|=
}; AplXl=
pgK)
用该迭代器可以将任意类型对象以二进制格式输出: 6PETIs
double a = 10; +we3BE.
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));