以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 bF'Jm*f
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 ,!dVhG#
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 _$_,r H
象当作char数组来处理。 Yk0/f|>O
template<class Container> apjoIO-<
class bit_iterator : public std::iterator<bidirectional_iterator_tag, MY'T%_id
void, void> [<WoXS1LX
{ Y<h6m]H
public: *Hz]<b?
explicit bit_iterator(Container& c) : m_container(&c) XhUVDmeUMb
{ %7[q%S
m_size = 8*sizeof(Container); p
z\8Bp}yo
m_index = 0; ^hcK&
} .uSVZqJ7
explicit bit_iterator() : m_container(0) KW!+Ws
{ >XxHp
m_size = 8*sizeof(Container); }W0_eQ
m_index = m_size; :7~DiH:Q
} wxJoWbn
bool operator* () i.{.koH<
{ p'A43
char mask = 1; wjXv{EsMq
char* pc = (char*)m_container; @z^7*#vQv
int i = (m_size-m_index-1)/8; |w{C!Q8l
int off = (m_size-m_index-1)%8; .F N
6/N\
mask <<=off; 0BH-kr
return pc & mask; -]t>'Q?
} dQ_hlx!J
bit_iterator<Container>& operator++() ^1y D&i'q
{ TKQ^D
m_index++; V|~o`(]
return *this; 9h/Hy aN
} NFF!g]QN
bit_iterator<Container>& operator++(int) r'4Dj&9Ac
{ $z`l{F4eMf
m_index++; #lO ^PK
return *this; T;]Ob3(BpW
} X]o"4#CQIX
bool operator==(bit_iterator<Container>& bitIt) vqZBDQ0
{ WrS>^\:
return m_index == bitIt.m_index; 6Yc(|>b!
} |*DkriYY
bool operator!=(bit_iterator<Container>& bitIt) j#xGB]
{ %w?C)$Kn\
return !(*this == bitIt); mT #A?C2
} z{&