以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 p +T&9
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 ;! 9_5Ar%
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 ]Ea7b
象当作char数组来处理。
9Np0<e3p
template<class Container> F}AbA pTv
class bit_iterator : public std::iterator<bidirectional_iterator_tag, $U8ap4EXM
void, void> YAPD7hA
{ /7lkbL
public: I"!gzI`Sd
explicit bit_iterator(Container& c) : m_container(&c) P9>C!0 -x
{ &(rd{j/*
m_size = 8*sizeof(Container); i&HV8&KygN
m_index = 0; #KK(Z\;
} :9`1bZ?a
explicit bit_iterator() : m_container(0) DA
wzXsx
{ <Z__Q
m_size = 8*sizeof(Container); ZH}NlEn
m_index = m_size; s Y6'y'a95
} j |i6/Pk9J
bool operator* () <+b:
{ ..T(9]h
char mask = 1; J6%op{7/
char* pc = (char*)m_container; X,N@`
int i = (m_size-m_index-1)/8; :RQ[(zD]
int off = (m_size-m_index-1)%8; <R(2 9QN
mask <<=off; < 5PeI
return pc & mask; i3"sArP"|
} g.]'0)DMW
bit_iterator<Container>& operator++() z
K(5&u
{ yTn@p(J
m_index++; 2)A
D'
return *this; 1v4kN
-
} =z/F=1^<
bit_iterator<Container>& operator++(int) :mrGB3x{
{ <S}qcjG
m_index++; bS'r}
return *this; B1M/5cr.
} 3k<#;(
bool operator==(bit_iterator<Container>& bitIt) d!t@A
{ 8<kme"%s
return m_index == bitIt.m_index; %_[-[t3
} [5VUcXGt*\
bool operator!=(bit_iterator<Container>& bitIt) PsgzDhRv
{ gAj)3T@
return !(*this == bitIt); $Y`aS^IW
} .+Ej%|l%
protected: 5);#\&B
Container* m_container; [86'/:L\2
private: , _$"6
int m_size; 4BT`|(7
int m_index; Q]wM/7
}; 8UIL_nPO
9^='&U9sr
用该迭代器可以将任意类型对象以二进制格式输出: ^kr)U8
double a = 10; qX(%Wn;n
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));