对标准库容器Serialize的模板函数,针对指针元素,支持各种智能指针!

原创 2005年03月02日 22:05:00

#ifndef mslk_utility_h_12345

#define mslk_utility_h_12345

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

#include <cassert>     // for assert

#include <vector>     // for std::vector

#include <memory>     // for std::auto_ptr

#include <afxtempl.h>    // for mfc::collect

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 );

  }

 } 

}

#endif  //mslk_utility_h_12345

剖析C++标准库智能指针(std::auto_ptr)

剖析C++标准库智能指针(std::auto_ptr) 1.Do you Smart Pointer?       Smart Pointer,中文名:智能指针, 舶来品?       ...

C++“准”标准库Boost学习指南(1):智能指针Boost.smart_ptr

我们学习C++都知道智能指针,例如STL中的std::auto_ptr,但是为什么要使用智能指针,使用它能带给我们什么好处呢? 最简单的使用智能指针可以不会因为忘记delete指针而造成内存泄露...
  • cbNotes
  • cbNotes
  • 2016年10月19日 11:48
  • 1112

C++标准库之智能指针类auto_ptr

初学C++标准库,想通过写博客的方式监督自己,让自己对C++mu

剖析C++标准库智能指针(std::auto_ptr)

1.Do you Smart Pointer?       Smart Pointer,中文名:智能指针, 舶来品?       不可否认,资源泄露(resource leak)曾经是C++程...

浅析C++标准库与boost库中的智能指针

什么是智能指针呢,它是行为类似于指针的类对象,但这种对象还有其他功能。我们为什么要封装智能指针类对象呢?这是因为C++中的动态内存需要用户自己来维护,动态开辟的空间,在出函数作用域或者程序正常退出前必...

C++标准库智能指针(std::auto_ptr)

智能指针两大特性: 1.构造栈对象的生命期控制堆上构造的对象的生命期 2.通过release来保证auto_ptr对对象的独权. 另必须使用显示构造 文章结构: 一、剖析C++标准库智能指针...
  • cbNotes
  • cbNotes
  • 2014年08月29日 15:31
  • 1957

剖析C++标准库智能指针(std::auto_ptr)

1.Do you Smart Pointer?      Smart Pointer,中文名:智能指针, 舶来品?      不可否认,资源泄露(resource leak)曾经是C++程序的一大噩梦...

引用内部函数绑定机制,R转义字符,C++引用,别名,模板元,宏,断言,C++多线程,C++智能指针

1、引用内部函数绑定机制 #include #include   using namespace std; using namespace std::placeholders;   /...

为什么auto_ptr智能指针不能作为STL标准容器的元素

为什么auto_ptr不可以作为STL标准容器的元素 假如有这样的一段代码,是否能够运行? ? 1 2 3 4 5 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:对标准库容器Serialize的模板函数,针对指针元素,支持各种智能指针!
举报原因:
原因补充:

(最多只允许输入30个字)