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

cc

  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
  38 隨筆 :: 14 文章 :: 21 評論 :: 0 Trackbacks

1.問題
 在很多用C++開發服務器產品時,需要將不同的數據類型存儲到一個容器中(有點類似HttpSession可以保存會話期間任意類型的數據),供其它使用程序查找。
 在Java和C#中這是一個簡單的問題,可以使用Object對象來實現類型無關的數據結構,并且很好的解決了內存回收等問題。
 但C++中很難做到這一點,C++是一門靜態類型語言,沒有一個所有類型的基類。


2.一般方法
 一般解決這個問題的辦法是使用void*指針來存儲數據,象下面的代碼:
 map<string,void*>
 但是這樣帶來幾個問題:
 (1)因為C++在不知道類類型時無法正確的釋放內存;
 (2)很多使用者使用它時,釋放內存的時機難于確定;


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


4.讓它知道何時釋放內存
 大家都知道,這時必須使用引用計數,不過很幸運有現成的,我們使用boost::share_ptr
 map<string,boost::share_ptr<Object*> >
 很好兩個問題都已經解決,但如何向他們中加入C++的基本類型呢?


5.開發基本類型的封裝類
 基本類型很多,如果每一個都寫一個類,太累了,我們可以定義一個模板,這里的難點是基本類型之間的操作符重載,不同類型之間的運算返回的類型并不相同,這就需要寫很多重載函數,在這里我們使用Loki來簡化這些操作。使用Loki的TypeList來自動計算應該是什么返回值
 #include"Typelist.h" //Loki頭文件
 template <typename T>
 class PrimerType:public Object
 {
 public:
  typedef T value_type;//基本類型
  typedef PrimerType<T> class_type;//基本類型的對象類型
 
 public:
  PrimerType()
   :m_value((value_type)0)
  {
  }
 
  template<typename Other>
   PrimerType(const Other& value)
   :m_value(value)
  {
  }
 
  ~PrimerType()
  {
   cout<<"PrimerType Destroy" << endl;
  }
 
  //基本類型轉換操作符重載
  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;
  }
 
  //作為類成員的算術運算符操作符重載
  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 );
 };
 
 //流輸入函數,不用輸出(通過類型操作符重載自動完成)
 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;
 
 
 //基本類型的對象類型
 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;
 
 //算術運算返回類型的traits,運算時以排在后面的類型返回
 #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以前的類型做算術運算都返回int32類型
  typedef typename ::Loki::TL::TypeAt<PRIMERTYPELIST, (resulttype_index<5)?5:resulttype_index >::Result  result_type;
 };

 
 //作為全局的算術運算符操作符重載 + - * /
 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;
 }
 //。。。省略 - * /等等
 
 // 邏輯運算符重載
 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.小結
 使用對象來表示基本類型,由于使用了virtual的析構它是有內存浪費的,但在很多應用中它是很有用的。
 同時你可以增加String/DateTime的特化支持,這樣就完整了
posted on 2008-07-10 14:44 醒目西西 閱讀(1410) 評論(0)  編輯 收藏 引用 所屬分類: 編程相關
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            免播放器亚洲一区| 欧美国产丝袜视频| 亚洲成色www久久网站| 伊人久久大香线蕉综合热线| 国产一区二区高清视频| 精品成人在线视频| 亚洲伦伦在线| 亚洲欧美日韩国产成人精品影院| 香蕉成人伊视频在线观看| 久久久久久久久久久久久9999| 蜜桃久久av一区| 亚洲区欧美区| 在线天堂一区av电影| 香蕉视频成人在线观看| 久久久久国产精品麻豆ai换脸| 欧美96在线丨欧| 国产精品久久久久久久久久久久久久| 国产日韩精品在线| 日韩一区二区电影网| 欧美在线视频一区| 亚洲国产精品www| 亚洲欧美日韩视频一区| 欧美高清视频一二三区| 国产欧美日韩综合一区在线观看| 欧美日韩在线一区二区| 狠狠色综合色区| 99在线视频精品| 久久亚洲午夜电影| 9色国产精品| 欧美wwwwww| 国产曰批免费观看久久久| 亚洲视频999| 免费成人黄色| 欧美伊人影院| 国产精品夜夜夜| 亚洲色图在线视频| 亚洲国产欧美一区| 麻豆九一精品爱看视频在线观看免费| 国产精品久久久久9999| 99精品黄色片免费大全| 蜜桃av综合| 欧美一区二区三区男人的天堂| 欧美日韩在线第一页| 亚洲精品人人| 欧美电影在线免费观看网站| 欧美一区二区免费观在线| 国产精品国产三级国产专播品爱网 | 激情视频一区二区| 亚洲欧洲99久久| 日韩一级黄色大片| 欧美久久久久久蜜桃| 亚洲全部视频| 亚洲第一综合天堂另类专| 久久久午夜精品| 亚洲成在人线av| 欧美激情一区二区三区蜜桃视频| 久久琪琪电影院| 国内偷自视频区视频综合| 久久精品国产一区二区三区免费看 | 尤物九九久久国产精品的特点 | 久久香蕉国产线看观看av| 亚洲欧美国产精品专区久久| 国产精品美女久久久| 欧美中文字幕第一页| 欧美一级在线播放| 激情六月综合| 亚洲电影毛片| 欧美日韩在线一区二区三区| 午夜精品福利电影| 国模私拍视频一区| 欧美在线啊v一区| 欧美在现视频| 亚洲第一成人在线| 美国成人毛片| 欧美成人免费大片| 99xxxx成人网| 亚洲午夜高清视频| 国产在线麻豆精品观看| 另类综合日韩欧美亚洲| 欧美风情在线| 亚洲自拍偷拍网址| 欧美在线影院在线视频| 亚洲电影专区| 中日韩美女免费视频网址在线观看 | 亚洲伊人网站| 精品av久久久久电影| 欧美激情综合色综合啪啪 | 亚洲香蕉成视频在线观看| 国产精品一区二区久激情瑜伽| 久久久99爱| 欧美精品日韩一区| 久久国产精品一区二区| 欧美福利视频一区| 性亚洲最疯狂xxxx高清| 蜜桃av久久久亚洲精品| 亚洲欧美999| 欧美/亚洲一区| 久久aⅴ国产欧美74aaa| 欧美福利一区| 久久婷婷国产综合精品青草| 欧美日韩不卡一区| 麻豆av福利av久久av| 欧美午夜视频一区二区| 欧美黄色成人网| 国产女精品视频网站免费| 亚洲国产精品va在看黑人| 国产午夜精品美女毛片视频| 亚洲毛片av在线| 亚洲黄色天堂| 久久激情五月丁香伊人| 亚洲一区二区三区四区在线观看| 乱码第一页成人| 久久精品亚洲国产奇米99| 国产精品国色综合久久| 91久久夜色精品国产九色| 精品999成人| 久久国内精品自在自线400部| 午夜亚洲性色福利视频| 欧美三级第一页| 亚洲精品中文字幕在线| 亚洲欧洲一级| 欧美电影免费观看大全| 美女免费视频一区| 激情校园亚洲| 久久精品欧洲| 六月婷婷一区| 在线看成人片| 葵司免费一区二区三区四区五区| 久久精品欧美日韩| 国产亚洲成av人在线观看导航 | 欧美亚洲日本国产| 欧美日韩一区自拍| 亚洲国产一区二区视频| 亚洲国产一区二区a毛片| 久久蜜臀精品av| 你懂的视频欧美| 亚洲国产一成人久久精品| 免费在线成人| 亚洲精品影院| 亚洲婷婷在线| 国产精品日韩高清| 亚洲欧美卡通另类91av | 亚洲三级影片| 亚洲美女黄网| 国产精品99一区| 亚洲尤物精选| 久久香蕉国产线看观看网| 国语对白精品一区二区| 卡一卡二国产精品| 亚洲品质自拍| 欧美一区二区三区啪啪| 在线播放豆国产99亚洲| 欧美国产日韩xxxxx| 一本大道久久精品懂色aⅴ| 欧美一级艳片视频免费观看| 国产色婷婷国产综合在线理论片a| 午夜欧美精品久久久久久久| 美女久久网站| 一本色道久久加勒比精品| 国产精品久久一区二区三区| 羞羞色国产精品| 欧美韩日高清| 午夜精品成人在线| 在线日韩av| 国产精品成人在线| 久久精品一区二区| 亚洲伦理网站| 久久久久久久久蜜桃| 亚洲乱码国产乱码精品精| 国产精品欧美在线| 免费成人黄色片| 亚洲欧美日韩精品综合在线观看| 蜜桃av一区| 午夜久久资源| 亚洲精品一品区二品区三品区| 国产精品三级久久久久久电影| 久久综合亚洲社区| 午夜欧美精品久久久久久久| 亚洲国产美女| 久久综合激情| 亚洲一区二区毛片| 亚洲裸体视频| 亚洲第一毛片| 国产日韩欧美在线看| 欧美日韩国产在线一区| 久久亚洲高清| 欧美一区二区三区四区高清| 亚洲精选久久| 亚洲第一色在线| 欧美成人国产一区二区| 久久精品亚洲精品国产欧美kt∨| 一卡二卡3卡四卡高清精品视频| 精品av久久707| 国产亚洲美州欧州综合国| 国产精品久久久久毛片大屁完整版| 欧美xx视频| 牛人盗摄一区二区三区视频| 久久人人97超碰精品888| 久久av一区二区三区| 亚洲永久在线观看|