以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 6],5X^*Y
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 kz,Nz09}W
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 Sm+Ek@Ax
象当作char数组来处理。 lmr{Ib2a
template<class Container> Y&'2/zI6~
class bit_iterator : public std::iterator<bidirectional_iterator_tag,
Q9%N>h9
void, void> C/!2q$
{ ]>R`]U9*O
public: xiA9X]FB
explicit bit_iterator(Container& c) : m_container(&c) _6=6 b!hD
{ .%WbXs
m_size = 8*sizeof(Container); ^Y #?@
m_index = 0; 0qJ(3N
} LsV!Sd
explicit bit_iterator() : m_container(0) L8 R|\Bx
{ $D9JsUij
m_size = 8*sizeof(Container); X5>p~;[9
m_index = m_size; 20% xD e
} =x/]2+
s
bool operator* () Q*mPU=<
{ [R
A=M
char mask = 1; !i)?j@D
char* pc = (char*)m_container; 3.R?=npA
int i = (m_size-m_index-1)/8; NwT3e&u%|
int off = (m_size-m_index-1)%8; dVO|q9 /
mask <<=off; @zd)]O]xH?
return pc & mask; *e_ /D$SC
} <]CO}r
bit_iterator<Container>& operator++() O;qS3
{ H1hj` '\"<
m_index++; ym(r;mj!
return *this; o5Pq>Y2T
} uo 7AU3\
bit_iterator<Container>& operator++(int) HpNf f0c
{ T!v%NZj3
m_index++; \P{VJ^)0
return *this; 1C .<@IZ
} H~||]_q|
bool operator==(bit_iterator<Container>& bitIt) [0MVsc=
{ *QAK9mc
return m_index == bitIt.m_index; $qIMYX
} evimnV
bool operator!=(bit_iterator<Container>& bitIt) mKxQU0 `
{ 17<\Q(YQ=
return !(*this == bitIt); -fG;`N5U
} U&`M G1uHe
protected: lg1?g)lv
Container* m_container; <k<
private: v
C><N
int m_size; lv$tp,+
int m_index; gfih;i.pY
}; s\>$ K%!H?
#MOEY|6
用该迭代器可以将任意类型对象以二进制格式输出: #1V vK
double a = 10; ,Y9lp)w
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));