青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

cc

  C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
  38 隨筆 :: 14 文章 :: 21 評(píng)論 :: 0 Trackbacks

1.問(wèn)題
 在很多用C++開(kāi)發(fā)服務(wù)器產(chǎn)品時(shí),需要將不同的數(shù)據(jù)類型存儲(chǔ)到一個(gè)容器中(有點(diǎn)類似HttpSession可以保存會(huì)話期間任意類型的數(shù)據(jù)),供其它使用程序查找。
 在Java和C#中這是一個(gè)簡(jiǎn)單的問(wèn)題,可以使用Object對(duì)象來(lái)實(shí)現(xiàn)類型無(wú)關(guān)的數(shù)據(jù)結(jié)構(gòu),并且很好的解決了內(nèi)存回收等問(wèn)題。
 但C++中很難做到這一點(diǎn),C++是一門靜態(tài)類型語(yǔ)言,沒(méi)有一個(gè)所有類型的基類。


2.一般方法
 一般解決這個(gè)問(wèn)題的辦法是使用void*指針來(lái)存儲(chǔ)數(shù)據(jù),象下面的代碼:
 map<string,void*>
 但是這樣帶來(lái)幾個(gè)問(wèn)題:
 (1)因?yàn)镃++在不知道類類型時(shí)無(wú)法正確的釋放內(nèi)存;
 (2)很多使用者使用它時(shí),釋放內(nèi)存的時(shí)機(jī)難于確定;


3.讓它正確釋放內(nèi)存
 我們可以定義一個(gè)公共的基類,讓所有需要放到容器的類型繼承它
 class Object
 {
 public:
  virtual ~Object(){cout<<"Object Destroy" << endl;}
 };
 由于使用了virtual析構(gòu)函數(shù)因此可以確保delete obj的時(shí)可以正常工作。因此上面的容器定義變成了這樣:
 map<string,Object*>


4.讓它知道何時(shí)釋放內(nèi)存
 大家都知道,這時(shí)必須使用引用計(jì)數(shù),不過(guò)很幸運(yùn)有現(xiàn)成的,我們使用boost::share_ptr
 map<string,boost::share_ptr<Object*> >
 很好兩個(gè)問(wèn)題都已經(jīng)解決,但如何向他們中加入C++的基本類型呢?


5.開(kāi)發(fā)基本類型的封裝類
 基本類型很多,如果每一個(gè)都寫一個(gè)類,太累了,我們可以定義一個(gè)模板,這里的難點(diǎn)是基本類型之間的操作符重載,不同類型之間的運(yùn)算返回的類型并不相同,這就需要寫很多重載函數(shù),在這里我們使用Loki來(lái)簡(jiǎn)化這些操作。使用Loki的TypeList來(lái)自動(dòng)計(jì)算應(yīng)該是什么返回值
 #include"Typelist.h" //Loki頭文件
 template <typename T>
 class PrimerType:public Object
 {
 public:
  typedef T value_type;//基本類型
  typedef PrimerType<T> class_type;//基本類型的對(duì)象類型
 
 public:
  PrimerType()
   :m_value((value_type)0)
  {
  }
 
  template<typename Other>
   PrimerType(const Other& value)
   :m_value(value)
  {
  }
 
  ~PrimerType()
  {
   cout<<"PrimerType Destroy" << endl;
  }
 
  //基本類型轉(zhuǎn)換操作符重載
  operator value_type() const
  {
   return m_value;
  }
 
  //賦值操作符重載
  const class_type& operator=(value_type value)
  {
   m_value=value;
   return *this;
  }
 
  bool operator!( ) const
  {
   return !m_value;
  }
 
  //作為類成員的算術(shù)運(yùn)算符操作符重載
  class_type& operator++()
  {// ++ 前綴
   m_value+=1;
   return *this;
  }
  const class_type operator++(int)
  {// ++ 后綴
   class_type oldValue=*this;
   m_value+=1;
   return oldValue;
  }
  class_type& operator--()
  {// -- 前綴
   m_value-=1;
   return *this;
  }
  const class_type operator--(int)
  {// -- 后綴
   class_type oldValue=*this;
   m_value-=1;
   return oldValue;
  }
 
  class_type& operator+=(const value_type& value)
  {
   m_value+=value;
   return *this;
  }
  //。。。省略-= /= *= &= |= ^= %= 等等
 private:
  value_type m_value;
  friend istream& operator>><T> ( istream& is, class_type& ptvalue );
 };
 
 //流輸入函數(shù),不用輸出(通過(guò)類型操作符重載自動(dòng)完成)
 template<typename T>
 istream& operator>> ( istream& is, PrimerType<T>& ptvalue )
 {
  is >> ptvalue.m_value;
  return is;
 }
 //基本類型重定義
 typedef __int8  int8;
 typedef __int16 int16;
 typedef __int32 int32;
 typedef __int64 int64;
 typedef unsigned __int8 uint8;
 typedef unsigned __int16 uint16;
 typedef unsigned __int32 uint32;
 typedef unsigned __int64 uint64;
 
 
 //基本類型的對(duì)象類型
 typedef PrimerType<bool>   Boolean;
 typedef PrimerType<int8>   Int8;
 typedef PrimerType<int16>   Int16;
 typedef PrimerType<int32>   Int32;
 typedef PrimerType<int64>   Int64;
 typedef PrimerType<uint8>   UInt8;
 typedef PrimerType<uint16>   UInt16;
 typedef PrimerType<uint32>   UInt32;
 typedef PrimerType<uint64>   UInt64;
 typedef PrimerType<float>   Float;
 typedef PrimerType<double>   Double;
 typedef PrimerType<long>   Long;
 typedef PrimerType<unsigned long> ULong;
 //更友好的名字
 typedef Int8     Char;
 typedef Int16     Short;
 typedef Int32     Int;
 typedef UInt8     Byte;
 typedef UInt16     UShort;
 typedef UInt32     UInt;
 
 //算術(shù)運(yùn)算返回類型的traits,運(yùn)算時(shí)以排在后面的類型返回
 #define  PRIMERTYPELIST TYPELIST_13(bool,int8,uint8,int16,uint16,int32,uint32,long,unsigned long,int64,uint64,float,double)
 //                 |
 //                 int
 template <typename T1, typename T2>
 struct ResultType_Traits
 {
  enum { lefttype_index =::Loki::TL::IndexOf<PRIMERTYPELIST,T1>::value};
  enum { righttype_index =::Loki::TL::IndexOf<PRIMERTYPELIST,T2>::value};
  enum { resulttype_index = (lefttype_index>righttype_index)?lefttype_index:righttype_index};

//在vc7.1下int32以前的類型做算術(shù)運(yùn)算都返回int32類型
  typedef typename ::Loki::TL::TypeAt<PRIMERTYPELIST, (resulttype_index<5)?5:resulttype_index >::Result  result_type;
 };

 
 //作為全局的算術(shù)運(yùn)算符操作符重載 + - * /
 template<typename T1,typename T2>
 typename ResultType_Traits<T1,T2>::result_type operator +(const PrimerType<T1>& lhs,const T2& rhs)
 {
  return (T1)lhs+rhs;
 }
 
 template<typename T1,typename T2>
 typename ResultType_Traits<T1,T2>::result_type operator +(const T1& lhs,const PrimerType<T2>& rhs)
 {
  return lhs+(T2)rhs;
 }
 
 template<typename T1,typename T2>
 typename ResultType_Traits<T1,T2>::result_type operator +(const PrimerType<T1>& lhs,const PrimerType<T2>& rhs)
 {
  return (T1)lhs+(T2)rhs;
 }
 //。。。省略 - * /等等
 
 // 邏輯運(yùn)算符重載
 template<typename T1,typename T2>
 bool operator ==(const PrimerType<T1>& lhs,const T2& rhs)
 {
  return (T1)lhs==rhs;
 }
 
 template<typename T1,typename T2>
 bool operator ==(const T1& lhs,const PrimerType<T2>& rhs)
 {
  return lhs==(T2)rhs;
 }
 
 template<typename T1,typename T2>
 bool operator ==(const PrimerType<T1>& lhs,const PrimerType<T2>& rhs)
 {
  return (T1)lhs==(T2)rhs;
 }
 //。。。省略 != >= 等等
 
 
6.小結(jié)
 使用對(duì)象來(lái)表示基本類型,由于使用了virtual的析構(gòu)它是有內(nèi)存浪費(fèi)的,但在很多應(yīng)用中它是很有用的。
 同時(shí)你可以增加String/DateTime的特化支持,這樣就完整了
posted on 2008-07-10 14:44 醒目西西 閱讀(1423) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 編程相關(guān)
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            狠狠干狠狠久久| 亚洲激情不卡| 欧美伊人久久大香线蕉综合69| 亚洲精品一二| 国产精品久久久久9999吃药| 先锋影音久久久| 欧美一区二区在线免费观看| 黑人巨大精品欧美黑白配亚洲 | 国产精品高潮呻吟久久av无限| 夜夜嗨av一区二区三区网站四季av | 欧美日韩精品免费观看| 一区二区av| 亚洲综合精品四区| 在线高清一区| 日韩一级在线| 国产婷婷精品| 久久精品日韩| 欧美69视频| 亚洲欧美日韩天堂| 久久久噜噜噜久久久| 一区二区高清在线观看| 午夜在线一区二区| 亚洲美洲欧洲综合国产一区| 亚洲图片你懂的| 亚洲福利在线视频| 亚洲午夜激情免费视频| 亚洲第一天堂av| 亚洲一区二区在线看| 亚洲福利视频专区| 亚洲在线视频网站| 亚洲全部视频| 久久国产精品久久久久久电车| 亚洲日本aⅴ片在线观看香蕉| 亚洲在线电影| 亚洲乱码视频| 久久久激情视频| 亚洲欧洲av一区二区| 欧美凹凸一区二区三区视频| 欧美一区二区三区日韩视频| 欧美激情视频网站| 麻豆精品网站| 国产日韩欧美精品| 日韩亚洲成人av在线| 亚洲国产va精品久久久不卡综合| 亚洲一区在线观看免费观看电影高清| 亚洲欧洲精品一区二区精品久久久| 亚洲男人的天堂在线aⅴ视频| 亚洲理论电影网| 另类天堂av| 久久综合久久综合九色| 国产欧美日韩高清| 日韩亚洲在线| 一区二区免费看| 欧美激情第二页| 欧美成人黑人xx视频免费观看| 国产日韩精品一区二区浪潮av| 一区二区不卡在线视频 午夜欧美不卡在 | 国产亚洲一区二区在线观看 | 亚洲综合999| 亚洲一区激情| 欧美亚洲第一页| 一区二区日韩免费看| 一区二区精品| 欧美视频二区| 亚洲在线观看免费视频| 亚洲欧美在线aaa| 国产乱人伦精品一区二区| 亚洲午夜一区二区| 先锋影音国产精品| 国产欧美一区二区三区久久人妖| 亚洲欧美欧美一区二区三区| 欧美一区二区三区四区在线观看地址| 国产精品久久久久久久9999 | 亚洲国产精品久久久| 亚洲国产成人久久| 欧美成人影音| 亚洲人成网站影音先锋播放| 一区二区日韩欧美| 国产精品久久午夜夜伦鲁鲁| 午夜激情综合网| 美女主播一区| 亚洲美女电影在线| 国产精品久久久久久超碰| 午夜日韩激情| 欧美暴力喷水在线| 一区二区不卡在线视频 午夜欧美不卡在 | 亚洲区在线播放| 欧美日韩一二三四五区| 在线一区二区视频| 久久精品免视看| 亚洲夫妻自拍| 欧美特黄一区| 久久国产精品久久国产精品| 亚洲福利电影| 欧美一进一出视频| 亚洲国产导航| 国产精品高清免费在线观看| 久久精品国产v日韩v亚洲| 亚洲欧洲在线观看| 欧美一区午夜视频在线观看| 亚洲高清不卡在线| 国产精品久久久久久超碰| 久久精品亚洲一区二区| 日韩系列欧美系列| 麻豆视频一区二区| 亚洲在线观看视频网站| 亚洲成人在线网站| 国产精品免费一区二区三区在线观看 | 亚洲在线免费| 亚洲国产精品一区二区久| 国产精品久久久久久久久免费桃花 | 亚洲免费激情| 欧美成人在线免费视频| 午夜精品久久久久久久久久久久久| 精品不卡一区二区三区| 国产精品久久久久9999吃药| 久久综合久久综合这里只有精品| 亚洲视频欧美视频| 亚洲国产精品久久久久婷婷884 | 99伊人成综合| 在线观看视频亚洲| 国产麻豆91精品| 国产精品sm| 欧美裸体一区二区三区| 美女被久久久| 久久久视频精品| 欧美一级视频一区二区| 亚洲一区二区欧美| 99视频精品全国免费| 亚洲人体大胆视频| 欧美风情在线观看| 久久这里只有| 老司机一区二区三区| 久久久久国产成人精品亚洲午夜| 亚洲一区观看| 亚洲自拍偷拍福利| 亚洲综合日韩中文字幕v在线| 一区二区三区视频在线看| 亚洲日本成人| 亚洲精品日韩综合观看成人91 | 欧美日韩国产成人在线观看| 猛男gaygay欧美视频| 美女网站在线免费欧美精品| 免播放器亚洲一区| 欧美成人免费大片| 欧美成人免费全部| 欧美黑人一区二区三区| 欧美激情久久久久| 欧美激情一区二区三区在线视频观看 | 国产午夜久久久久| 国内精品久久久久国产盗摄免费观看完整版 | 欧美日韩123| 欧美日韩专区| 国产精品天天看| 国产一区二区三区免费不卡| 国语自产偷拍精品视频偷| 激情久久一区| 亚洲黄色影片| 中文高清一区| 久久精品成人| 欧美韩国日本综合| 亚洲精品女av网站| 亚洲另类自拍| 亚洲欧美激情四射在线日 | 亚洲制服av| 久久国产精品久久w女人spa| 欧美 日韩 国产精品免费观看| 欧美另类专区| 国产日产高清欧美一区二区三区| 狠狠综合久久| 一区二区精品在线观看| 欧美自拍偷拍午夜视频| 老鸭窝毛片一区二区三区| 亚洲国产精品高清久久久| 中国日韩欧美久久久久久久久| 久久xxxx精品视频| 欧美剧在线观看| 国产一区二区看久久| 亚洲日本中文字幕| 午夜亚洲福利| 亚洲激情成人在线| 性欧美xxxx大乳国产app| 蜜桃av噜噜一区二区三区| 国产精品久久久久高潮| 亚洲二区在线视频| 香蕉免费一区二区三区在线观看 | 美女国产精品| 一区二区三区久久网| 久久亚洲午夜电影| 国产精品久久一级| 亚洲激情综合| 久久精品首页| 在线亚洲成人| 欧美a级在线| 精品99视频| 欧美一区二区免费| aa日韩免费精品视频一| 麻豆免费精品视频| 激情小说另类小说亚洲欧美| 午夜精品久久久久久久久久久久 |