MemBlock类似boost any的东西 for VC6

 

//

//suxiaojack 2011.05

//pack any struct and class instance object to MemBlock

//for visual studio 6 C++

//if you have some changes ,please Notify suxiaojack@163.com ,Thanks!

class DataHolderInterface

{

public:

         //DataHolderInterface(){};

         virtual ~DataHolderInterface(){};

         virtual DataHolderInterface* clone(){return NULL;};

         virtual const std::type_info& type(){return typeid(void);};

};

template <typename T>

class DataHolder:public DataHolderInterface

{

         DataHolder();

public:

         DataHolder(T d);

         T data;

         virtual ~DataHolder();

         DataHolderInterface* clone();

         virtual const std::type_info& type();

};

 

template <typename T>

const std::type_info& DataHolder<T>::type(){return typeid(T);};

template <typename T>

DataHolderInterface* DataHolder<T>::clone(){return new DataHolder<T>(data);};

template <typename T>

DataHolder<T>::DataHolder(T d){data=d;};

template <typename T>

DataHolder<T>::DataHolder(){};

template <typename T>

DataHolder<T>::~DataHolder(){};

//

template <typename T> struct TypeWapper{};

#define AS(type) TypeWapper<type>()

//

//使用MemBlock,默认初始化个对象MemBlock mb;

//然后再用等于符号赋值mb=any_value;

//取出时采用type value=mb.get(AS(type));

//取值前用mb.empty()测试一下最好.

class  MemBlock

{

         DataHolderInterface* pdataHolder;

public:

         MemBlock():pdataHolder(NULL){

                   pdataHolder=NULL;

         };

         MemBlock(const MemBlock& a):pdataHolder(NULL){

                   if(a.pdataHolder!=NULL)

                            pdataHolder=a.pdataHolder->clone();

         }

         ~MemBlock(){

                   reset();

         };

         void reset(){

                   if(pdataHolder!=NULL)

                   {

                            delete pdataHolder;

                            pdataHolder=NULL;

                   }

         };

         template <typename T>

         MemBlock& operator=(const T& v){

                   reset();

                   pdataHolder = new DataHolder<T>((T)v);

                   return *this;

         };

         template<>

         MemBlock& operator=(const MemBlock& a){

                   reset();

                   pdataHolder=a.pdataHolder->clone();

                   return *this;

         };

         template <typename T>

         T get(TypeWapper<T>){

                   if(pdataHolder!=NULL&&pdataHolder->type()==typeid(T))

                            return (reinterpret_cast<DataHolder<T>*>(pdataHolder))->data;

                   else

                   {

                   #ifdef _DEBUG

                            AfxTrace("!!MemBlock get Failed!!Want %s type data,but %s./n",typeid(T).name(),pdataHolder->type().name());

                   #endif

                            return T();

                   }

 

         };

         //test ok?

         bool empty(){

                   return pdataHolder==NULL;

         };

};



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值