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

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>
            久久久国产一区二区| 久久亚洲精品一区二区| 国产精品福利在线观看| 男人插女人欧美| 亚洲精品美女| 久久久另类综合| 久久久久久有精品国产| 免费中文字幕日韩欧美| 最新精品在线| 免费视频久久| 欧美成年人在线观看| 久久综合电影| 免费欧美日韩国产三级电影| 美女爽到呻吟久久久久| 欧美成人免费网| 亚洲精品在线视频观看| 亚洲人成免费| 亚洲欧美视频| 亚洲激情国产| 99av国产精品欲麻豆| 亚洲综合电影| 久久亚洲精品一区二区| 欧美二区不卡| 国产日韩欧美三区| 狠狠狠色丁香婷婷综合激情| 国产欧美日本一区视频| 亚洲精品九九| 久久av红桃一区二区小说| 你懂的视频一区二区| 一区二区av在线| 久久久久国产精品午夜一区| 欧美日韩国产色视频| 国产亚洲精品久| 一本色道久久综合亚洲精品按摩| 香蕉亚洲视频| 亚洲欧洲精品天堂一级| 久久不射网站| 国产精品一区一区三区| 日韩亚洲国产精品| 久久在线91| 亚洲国产一区在线| 亚洲七七久久综合桃花剧情介绍| 亚洲一区欧美一区| 欧美人成在线视频| 亚洲国产老妈| 麻豆精品传媒视频| 99国产一区| 欧美大尺度在线观看| 国产字幕视频一区二区| 亚洲欧美日韩精品久久久| 亚洲国产精品999| 久久人人爽人人爽爽久久| 国产精品青草久久久久福利99| 久久精品人人做人人爽电影蜜月| 亚洲激情欧美| 久久久免费观看视频| 国产精品一区二区三区久久| 在线亚洲高清视频| 91久久综合亚洲鲁鲁五月天| 久久综合图片| 亚洲国产成人av在线| 久久亚洲色图| 久久久久久久激情视频| 好吊视频一区二区三区四区| 久久精品国产亚洲aⅴ| 亚洲欧美日韩国产一区| 国产麻豆综合| 久久精品女人| 欧美一区不卡| 韩国自拍一区| 欧美h视频在线| 欧美77777| 一区二区三区免费网站| 欧美国产视频日韩| 欧美高清视频一区二区三区在线观看 | 欧美一级久久久| 蜜臀va亚洲va欧美va天堂| 久久久人成影片一区二区三区观看 | 国产精品高潮视频| 日韩视频专区| 一区二区欧美在线观看| 国产精品午夜春色av| 久久精品亚洲乱码伦伦中文| 久久精品视频导航| 亚洲精品久久久一区二区三区| 亚洲精品美女在线观看| 国产精品久久中文| 久久理论片午夜琪琪电影网| 裸体歌舞表演一区二区| 99视频超级精品| 亚洲一区在线观看视频| 国产精品久久久久一区二区三区| 久久九九全国免费精品观看| 美乳少妇欧美精品| 亚洲一区二区精品在线| 欧美在线影院| 亚洲视频在线观看三级| 亚洲高清资源| 国产精品社区| 亚洲国产婷婷香蕉久久久久久| 欧美日韩国产色站一区二区三区| 欧美一区二区三区免费视频| 奶水喷射视频一区| 久久狠狠婷婷| 欧美日韩国产片| 欧美jizz19hd性欧美| 国产精品视频久久一区| 欧美成人精品福利| 国产精品欧美日韩一区| 久久久噜久噜久久综合| 亚洲精品系列| 欧美国产成人在线| 久久综合免费视频影院| 亚洲精品影院| 宅男噜噜噜66一区二区| 亚洲国产一区二区三区青草影视| 在线视频欧美一区| 亚洲精品自在久久| 久久久久久亚洲精品杨幂换脸| 亚洲一区欧美一区| 欧美激情精品久久久久| 欧美电影免费观看大全| 国语精品中文字幕| 欧美一区二区高清在线观看| 日韩一区二区精品葵司在线| 久久漫画官网| 久久综合狠狠综合久久激情| 国产精品一区二区在线观看不卡| 欧美激情bt| 亚洲国产精品va| 久久久久久久999精品视频| 午夜精品在线观看| 欧美性色综合| 欧美二区不卡| 国产日韩成人精品| 亚洲欧美精品suv| 午夜性色一区二区三区免费视频| 欧美日韩国产在线播放| 亚洲精品欧洲| 亚洲一级一区| 国产精品久久久久久户外露出| 欧美黑人在线播放| 亚洲剧情一区二区| 麻豆久久久9性大片| 欧美黄色大片网站| 亚洲精品国精品久久99热| 欧美激情乱人伦| 欧美激情网友自拍| 亚洲裸体视频| 国产精品家教| 久久一区中文字幕| 在线播放亚洲| 欧美精品久久久久a| 亚洲九九九在线观看| 亚洲一区二区三区777| 欧美日韩在线三区| 亚洲午夜一区二区| 久热精品在线| 亚洲精品国产日韩| 国产精品嫩草影院av蜜臀| 午夜免费电影一区在线观看| 久久在线91| 亚洲午夜高清视频| 狠狠做深爱婷婷久久综合一区| 女同性一区二区三区人了人一| 亚洲美女色禁图| 久久嫩草精品久久久精品| 亚洲美女电影在线| 国产欧美一区二区精品仙草咪| 欧美一级二级三级蜜桃| 亚洲高清一二三区| 香蕉成人久久| 亚洲精品一二三区| 国产精品亚洲一区| 美女视频一区免费观看| 国产精品99久久久久久宅男| 欧美日韩一区三区四区| 欧美成人免费在线视频| 亚洲一区二区欧美日韩| 黄色成人免费观看| 欧美日韩久久不卡| 欧美亚洲综合另类| 亚洲日本激情| 久久漫画官网| 亚洲伊人伊色伊影伊综合网| 极品尤物av久久免费看| 欧美午夜精品久久久久免费视| 久久九九国产精品| 亚洲少妇自拍| 亚洲欧洲一区二区天堂久久| 欧美一区二区女人| 狠狠综合久久| 国产精品久久久久婷婷| 欧美激情二区三区| 久久久久久亚洲精品不卡4k岛国| 一区二区三区日韩精品| 亚洲成在线观看| 久久免费精品日本久久中文字幕| 亚洲一区在线视频| 最新国产の精品合集bt伙计|