基本思路是直接將對象的內(nèi)存數(shù)值以二進制的格式輸出,但是如何獲取對象內(nèi)存的二進制結(jié)構(gòu)
是關(guān)鍵。解決方法是通過位操作找出對象內(nèi)存的每一個bit的值。并把該方法封裝成一個迭代器。
?要注意的問題是位操作符只能對整數(shù)類型進行操作,為了對所有類型的對象都有效,必須將對
象當作char數(shù)組來處理。
template<class?Container>
class?bit_iterator?:?public?std::iterator<bidirectional_iterator_tag,
?void,?void>
{
public:
?explicit?bit_iterator(Container&?c)?:?m_container(&c)
?{
??m_size??=?8*sizeof(Container);
??m_index?=?0;
?}
?explicit?bit_iterator()?:?m_container(0)
?{
??m_size??=?8*sizeof(Container);
??m_index?=?m_size;
?}
?bool?operator*?()
?{
??char?mask?=?1;
??char*?pc?=?(char*)m_container;
??int?i?????=?(m_size-m_index-1)/8;
??int?off???=?(m_size-m_index-1)%8;
??mask?<<=off;
??return??pc[i]?&?mask;
?}
?bit_iterator<Container>&?operator++()
?{
??m_index++;
??return?*this;
?}
?bit_iterator<Container>&?operator++(int)
?{
??m_index++;
??return?*this;
?}
?bool?operator==(bit_iterator<Container>&?bitIt)
?{
??return?m_index?==?bitIt.m_index;
?}
?bool?operator!=(bit_iterator<Container>&?bitIt)
?{
??return?!(*this?==?bitIt);
?}
protected:
?Container*?m_container;
private:
?int?m_size;
?int?m_index;
};
用該迭代器可以將任意類型對象以二進制格式輸出:
double?a?=?10;
copy(bit_iterator<double>(a),?bit_iterator<double>?(),?ostream_iterator<bool>(cout,?""));