使std的容器类能方便的和MFC的CObject::Serialize函数一起使用的模板函数

#ifndef my_utility_h
#define my_utility_h
////////////////////////////////////////////////////////////////
//   通用对象指针存取 CommonObjectPointerCollectSerialize<T> \
//   10.26号,能处理集合元素为各种 smart_ptr 的情况

////////////////////////////////////////////////////////////////
#include <boost/type_traits.hpp> // for boost::type_traits
#include <cassert>                     // for assert

namespace MyNS{


namespace detail{ /// support smart_ptr

template<bool bIsPtr>
struct SerialzeElem   // pointer
{
 template<typename T>
 static void do_write(CArchive &ar,T const& op)
 {
  CObject *pOb = dynamic_cast<CObject*>(op);
  assert(NULL != pOb);
  ar<<pOb;
 }

 template<typename T>
 static void do_read(CArchive &ar,T& op)
 {
  CObject *pOb=NULL;
  ar>>pOb;
  op = dynamic_cast<T>(pOb);
  assert(NULL != op);
 }
};

template<>
struct SerialzeElem<false> // smart_ptr
{
 template<typename T>
 static void do_write(CArchive &ar,T const& sp)
 {
  CObject *pOb = dynamic_cast<CObject*>(sp.get());
  assert(NULL != pOb);
  ar<<pOb;
 }

 template<typename T>
 static void do_read(CArchive &ar,T& sp)
 {
  CObject *pOb=NULL;
  ar>>pOb;
  T::element_type* p = dynamic_cast<T::element_type*>(pOb); 
  assert(NULL != p);  
  sp = T(p);
 }
};

} // end: detail

// 10.26 update: 支持元素类型为Smart_ptr的集合
// 通用对象指针的serialize
template<typename T> // T ==> std::list<…>;std::vector<…>
void CommonObjectPointerCollectSerialize( CArchive &ar, T &refAnyDataCollect ) 
{
 DWORD dwCount;
 if (ar.IsStoring())
 {
  dwCount = refAnyDataCollect.size();  
  ar<<dwCount;
  assert(dwCount>=0);
  
  T::iterator itBeg(refAnyDataCollect.begin()),itEnd(refAnyDataCollect.end());
  for(; itBeg!=itEnd; ++itBeg)
  {
   sw::detail::SerialzeElem<boost::is_pointer<T::value_type>::value >::do_write(ar,*itBeg);
  }
 }
 else
 {
  ar>>dwCount; 
  assert(dwCount>=0);
  while (dwCount--)
  {
   T::value_type v;
   sw::detail::SerialzeElem<boost::is_pointer<T::value_type>::value >::do_read(ar,v);
   refAnyDataCollect.push_back( v );
  }
 } 
}

}  // end namespace:MyNS
#endif //my_utility_h

posted on 2004-12-06 14:49  mslk  阅读(605)  评论(0)    收藏  举报