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

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 醒目西西 閱讀(1415) 評論(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>
            制服丝袜激情欧洲亚洲| 欧美日韩亚洲一区三区 | 亚洲国产日韩欧美在线99 | 亚洲国产婷婷香蕉久久久久久99| 久久嫩草精品久久久久| 在线观看日韩专区| 欧美电影免费观看高清| 欧美激情一二区| 一区二区三区成人| 亚洲综合色婷婷| 国产一区美女| 亚洲第一福利视频| 欧美视频三区在线播放| 久久久久成人网| 久热国产精品| 亚洲电影免费在线观看| 国产一区二区三区高清| 久热爱精品视频线路一| 欧美顶级少妇做爰| 亚洲欧美在线免费| 久久女同互慰一区二区三区| 99视频在线精品国自产拍免费观看 | 一区在线免费| 亚洲日本中文字幕免费在线不卡| 欧美午夜视频在线| 美女主播一区| 国产精品videosex极品| 美国十次了思思久久精品导航| 欧美精品成人91久久久久久久| 亚洲综合视频网| 另类国产ts人妖高潮视频| 亚洲一区二区三区四区五区午夜| 久久激情五月激情| 亚洲一品av免费观看| 久久频这里精品99香蕉| 午夜精品美女自拍福到在线| 久久综合国产精品| 久久精品一区二区三区不卡牛牛| 欧美激情精品久久久久久黑人 | 黄色一区二区三区| 亚洲视频在线观看免费| 亚洲三级毛片| 欧美在线亚洲综合一区| 亚洲一区综合| 欧美顶级少妇做爰| 蜜桃精品久久久久久久免费影院| 欧美性片在线观看| 欧美激情影音先锋| 韩日视频一区| 午夜亚洲影视| 香蕉久久夜色精品| 欧美视频一区二区| 亚洲免费观看视频| 亚洲日本激情| 女主播福利一区| 美女爽到呻吟久久久久| 国自产拍偷拍福利精品免费一| 亚洲小说春色综合另类电影| 在线午夜精品| 欧美日韩免费在线视频| 亚洲日韩成人| 日韩亚洲欧美中文三级| 欧美激情视频一区二区三区免费| 免费在线成人| 亚洲人成啪啪网站| 美日韩精品免费| 亚洲国产成人不卡| 亚洲精品久久| 欧美日韩成人在线播放| 亚洲美女诱惑| 亚洲综合首页| 国产精品久久久久秋霞鲁丝| 亚洲午夜日本在线观看| 午夜在线一区二区| 国产午夜精品久久久久久免费视 | av成人免费| 亚洲性夜色噜噜噜7777| 欧美视频日韩| 亚洲男人影院| 久热这里只精品99re8久| 一区在线免费观看| 欧美国产精品日韩| 夜夜嗨av一区二区三区网页| 亚洲影院色无极综合| 国产日韩一区在线| 久久精品成人一区二区三区蜜臀| 免费视频一区| 一区二区精品| 国产欧美一区二区精品婷婷 | 免费在线观看日韩欧美| 亚洲国产高清aⅴ视频| 一区二区国产日产| 国产精品永久免费视频| 久久久久久色| 亚洲精品视频免费| 久久精品91久久久久久再现| 亚洲电影第1页| 欧美日韩在线影院| 久久久九九九九| 亚洲伦理中文字幕| 久久综合激情| 亚洲专区一区| 亚洲高清不卡一区| 国产精品高潮视频| 狂野欧美性猛交xxxx巴西| 在线亚洲欧美视频| 麻豆成人精品| 亚洲欧美韩国| 最近中文字幕日韩精品| 国产精品一区二区你懂得| 欧美aⅴ一区二区三区视频| 亚洲一区二区三区四区五区午夜| 麻豆精品在线视频| 亚洲欧美一区二区精品久久久| 在线看欧美日韩| 国产精品拍天天在线| 欧美精品首页| 久久久久国产精品www| 亚洲一级在线| 99re6这里只有精品| 欧美成人一区在线| 久久精品国产精品亚洲| 亚洲少妇诱惑| 99视频一区二区| 91久久久亚洲精品| 亚洲国产成人av| 国内精品模特av私拍在线观看| 欧美日韩视频在线第一区| 麻豆精品一区二区av白丝在线| 亚洲女人av| 亚洲影视综合| 宅男66日本亚洲欧美视频| 亚洲激情社区| 亚洲成人在线网站| 欧美国产在线电影| 牛人盗摄一区二区三区视频| 久久福利影视| 久久精品亚洲一区二区| 欧美一区二区视频在线观看| 亚洲一区免费在线观看| 一区二区动漫| 亚洲午夜精品久久| 亚洲一区影院| 欧美一级午夜免费电影| 久久岛国电影| 久久精品在线| 久久亚洲私人国产精品va| 久久成人免费网| 久久一区二区三区国产精品| 久久久久久久久一区二区| 久久久久综合一区二区三区| 久久精品国产2020观看福利| 久久精品首页| 理论片一区二区在线| 欧美成人亚洲| 亚洲精品一级| 亚洲一区视频在线| 久久av一区二区三区漫画| 久久亚洲综合网| 欧美激情1区2区3区| 欧美色精品天天在线观看视频| 国产精品视频观看| 国产真实久久| 亚洲人成精品久久久久| 亚洲视频免费观看| 欧美综合国产| 欧美大片国产精品| 中国女人久久久| 久久久www成人免费无遮挡大片| 美女视频黄a大片欧美| 欧美精品18videos性欧美| 欧美日韩一区二区国产| 国产香蕉久久精品综合网| 影音先锋亚洲视频| 99精品视频网| 久久精品国产久精国产爱| 欧美激情亚洲自拍| 亚洲视屏在线播放| 久久久久亚洲综合| 欧美视频中文字幕| 在线观看欧美成人| 亚洲欧美经典视频| 欧美黄色成人网| 亚洲一区二区三区免费视频 | 亚洲激情在线播放| 中国av一区| 欧美a级大片| 国产欧美日韩精品丝袜高跟鞋| 亚洲国产另类久久久精品极度| 亚洲午夜久久久久久尤物 | 久久深夜福利免费观看| 亚洲欧洲三级| 亚洲欧美在线免费观看| 欧美二区在线播放| 黄色亚洲在线| 香港久久久电影| 亚洲免费成人av| 免费成人高清视频| 韩国精品在线观看| 欧美一区二区三区日韩视频|