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

.net中的 delegate的標準C++模擬(轉)

Posted on 2008-11-07 10:05 RichardHe 閱讀(429) 評論(0)  編輯 收藏 引用 所屬分類: [再轉]

用模板的偏特化和成員模板,重載函數調用運算符成功的實現了delegate,既可以綁定普通函數,也可以綁定對象及其成員函數
在cygnuwin下編譯通過, 
還不支持一個delegate包含多個函數的用法,不過相信很簡單,從std::list派生一個類 
就可以了 
我用的cygun有些毛病, 
my_delegate d2=my_delegate(t,&Test::f); 
                           ^如果寫成&t,就會導致編譯器內部錯誤,沒辦法了 
  
我本來寫程序是加空行的,貼到BBS上就沒了,忍受一下吧 
Win32下的各種調用約定很討厭,沒有考慮,不過實現起來不費什么腦筋,就是麻煩, 
不管了 
  
// Test.cpp : Defines the entry point for the console application. 
// 
#include <stddef.h> 
template<class T> 

//函數traits,用來提取函數的返回類型

struct function_traits 

}; 
template<class RT> 
struct function_traits< RT(*)() > 

 typedef RT result_type; 
}; 
template<class RT,class AT> 
struct function_traits< RT(*)(AT) > 

 typedef RT result_type; 
 typedef AT argument_type; 
}; 
template<class RT,class AT1,class AT2> 
struct function_traits< RT(*)(AT1,AT2) > 

 typedef RT result_type; 
 typedef AT1 first_argument_type; 
 typedef AT2 second_argument_type; 
};

// 函數traits,用來提取類成員函數的返回類型


template<class RT, class OT> 
struct function_traits< RT (OT::*)() > 

 typedef OT object_type; 
 typedef RT result_type; 
}; 
template<class RT, class OT, class AT> 
struct function_traits< RT (OT::*)(AT) > 

 typedef OT object_type; 
 typedef RT result_type; 
 typedef AT argument_type; 
  
 typedef AT first_argument_type; 
}; 
template<class RT,class OT,class AT1,class AT2> 
struct function_traits< RT (OT::*)(AT1,AT2) > 

 typedef OT object_type; 
 typedef RT result_type; 
 typedef AT1 first_argument_type; 
 typedef AT2 second_argument_type; 
};

// 把一個普通函數類向轉化為類型兼容的指定類的成員函數類型 
template <typename OT, typename PFT> 
struct to_member_function_pointer 

}; 
template <typename OT,typename RT> 
struct to_member_function_pointer< OT, RT(*)() > 

 typedef RT (OT::*type)(); 
}; 
template <typename OT, typename RT, typename AT> 
struct to_member_function_pointer< OT, RT(*)(AT) > 

 typedef RT (OT::*type)(AT); 
}; 
template <typename OT, typename RT, typename AT1, typename AT2> 
struct to_member_function_pointer< OT, RT(*)(AT1,AT2) > 

 typedef RT (OT::*type)(AT1,AT2); 
}; 
template <typename OT, typename RT, typename AT1, typename AT2, typename AT3> 
struct to_member_function_pointer< OT, RT(*)(AT1,AT2,AT3) > 

 typedef RT (OT::*type)(AT1,AT2,AT3); 
}; 

// 轉化為const 成員函數

template <typename OT, typename PFT> 
struct to_const_member_function_pointer 

}; 
template <typename OT, typename RT> 
struct to_const_member_function_pointer< OT, RT(*)() > 

 typedef RT (OT::*type)() const; 
}; 
template <typename OT, typename RT, typename AT> 
struct to_const_member_function_pointer< OT, RT(*)(AT) > 

 typedef RT (OT::*type)(AT) const; 
}; 
template <typename OT, typename RT, typename AT1, typename AT2> 
struct to_const_member_function_pointer< OT, RT(*)(AT1,AT2) > 

 typedef RT (OT::*type)(AT1,AT2) const; 
}; 
template <typename OT, typename RT, typename AT1, typename AT2, typename AT3> 
struct to_const_member_function_pointer< OT, RT(*)(AT1,AT2,AT3) > 

 typedef RT (OT::*type)(AT1,AT2,AT3) const; 
}; 

// delegate的實現

template <typename PFT> 
class delegate 

 class object 
 { 
 }*m_pObject; // 對象指針,是一個代理對象
 typedef typename to_member_function_pointer<object, PFT>::type object_member_fuunction_pointer; 
 union 
 { 
  PFT m_pf; 
  object_member_function_pointer m_pmf; 
 }; // 函數指針和成員函數指針的聯合體
 public: 
  typedef typename function_traits<PFT>::result_type result_type; 
  
  delegate() 
  { 
   m_pObject=NULL; 
   m_pf=NULL; 
  } 
  
  delegate(PFT pf) 
  { 
   operator=(pf); 
  } 
  
  template<typename OT> 
   delegate( 
   OT *pObject, 
   typename to_member_function_pointer<OT, PFT>::type pmf 
   ) 
  { 
   m_pObject=reinterpret_cast<object*>(pObject); 
   m_pmf=*(reinterpret_cast<object_member_function_pointer*>(&pmf)); 
  } 
  
  template<typename OT> 
   delegate( 
   OT &pObject, 
   typename to_member_function_pointer<OT, PFT>::type pmf 
   ) 
  { 
   m_pObject=reinterpret_cast<object*>(&pObject); 
   m_pmf=*(reinterpret_cast<object_member_function_pointer*>(&pmf)); 
  } 
  
  template<typename OT> 
   delegate( 
   const OT *pObject, 
   typename to_const_member_function_pointer<OT, PFT>::type pmf 
   ) 
  { 
   m_pObject=const_cast<object*>(reinterpret_cast<object*>(pObject)); 
   m_pmf=*(reinterpret_cast<object_member_function_pointer*>(&pmf)); 
  } 
  
  template<typename OT> 
   delegate( 
   const OT &pObject, 
   typename to_const_member_function_pointer<OT, PFT>::type pmf 
   ) 
  { 
   m_pObject=const_cast<object*>(reinterpret_cast<object*>(&pObject)); 
   m_pmf=*(reinterpret_cast<object_member_function_pointer*>(&pmf)); 
  } 
  
  delegate & operator=(PFT pf) 
  { 
   m_pf=pf; 
   m_pObject=0; 
   return *this; 
  } 
  template<int> 
:gcc的函數模板不許無參數,加了個占位的"int"才能通過 
   result_type operator()() 
  { 
   if(m_pObject) 
    return (m_pObject->*m_pmf)(); 
   else 
    return m_pf(); 
  } 
  template<typename AT> 
   result_type operator()( 
   AT a1 
   ) 
  { 
   if(m_pObject) 
    return (m_pObject->*m_pmf)(a1); 
   else 
    return m_pf(a1); 
  } 
  template<typename AT1, typename AT2> 
   result_type operator()( 
   AT1 a1, 
   AT2 a2 
   ) 


   if(m_pObject) 
    return (m_pObject->*m_pmf)(a1,a2); 
   else 
    return m_pf(a1,a2); 
  } 
  template<typename AT1, typename AT2, typename AT3> 
   result_type operator()( 
   AT1 a1, 
   AT2 a2, 
   AT3 a3 
   ) 
  { 
   if(m_pObject) 
    return (m_pObject->*m_pmf)(a1,a2,a3); 
   else 
    return m_pf(a1,a2,a3); 
  } 
}; 
int gf(int) 

 return 0; 

class Test 

public: 
 int f(int){return 0;} 
}; 
typedef delegate < int (*)(int) > my_delegate; 
int main() 

 Test t;

 

 my_delegate d1=&gf; // 普通函數
 my_delegate d2=my_delegate(t,&Test::f); //對象和類成員函數
 d1(0); //調用
 d2(2); 
}

posts - 94, comments - 138, trackbacks - 0, articles - 94

Copyright © RichardHe

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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爽爽爽视频| 欧美黄色一区| 男女激情久久| 欧美成人一二三| 亚洲国产精品传媒在线观看 | 91久久精品国产91久久| 亚洲国产精品综合| 中文在线资源观看网站视频免费不卡 | 国产亚洲aⅴaaaaaa毛片| 国产美女精品视频免费观看| 国产一区视频观看| 亚洲国产影院| 亚洲欧美在线一区| 久久久噜噜噜久噜久久| 欧美福利一区| 亚洲婷婷国产精品电影人久久| 亚洲一区尤物| 久久久国产午夜精品| 欧美激情无毛| 国产日韩欧美一区二区三区在线观看 | 亚洲女女女同性video| 久久国内精品自在自线400部| 欧美黑人多人双交| 国产精品女同互慰在线看| 在线电影院国产精品| 中文亚洲免费| 欧美激情二区三区| 欧美亚洲日本国产| 欧美精品一区二区视频| 国产精品久久久久久久久久三级| 国内精品久久久| 亚洲欧美日本视频在线观看| 欧美sm视频| 午夜精品视频在线| 欧美日韩影院| 亚洲娇小video精品| 国产精品vvv| 亚洲激情一区二区三区| 久久久精品国产免费观看同学| 99国产精品国产精品久久| 久久久久久久高潮| 国产精品三级视频| 影音先锋亚洲一区| 亚洲欧美国产精品桃花| 亚洲区欧美区| 久久网站免费| 狠狠入ady亚洲精品| 欧美一区二区黄色| 在线亚洲免费视频| 欧美激情综合五月色丁香小说| 一区二区三区在线视频观看| 久久激情网站| 午夜精品av| 欧美在线视频二区| 国产一二三精品| 久久精品一二三区| 亚洲永久网站| 亚洲第一区在线| 亚洲第一主播视频| 一区二区三区.www| 久久久久国产精品一区三寸| 每日更新成人在线视频| 国产真实精品久久二三区| 亚洲尤物在线视频观看| 亚洲国产精品国自产拍av秋霞| 亚洲欧美国产日韩天堂区| 欧美国产乱视频| 亚洲国产高清视频| 久久九九全国免费精品观看| 亚洲精品一区二区三区99| 欧美精品在欧美一区二区少妇| 国产在线观看91精品一区| 欧美一区成人| 亚洲欧美亚洲| 激情久久婷婷| 欧美jizzhd精品欧美巨大免费| 一区二区三区回区在观看免费视频 | 亚洲免费成人| 欧美三级不卡| 一区二区不卡在线视频 午夜欧美不卡在 | 欧美一级专区| 黑人巨大精品欧美黑白配亚洲| 久久久青草青青国产亚洲免观| 欧美一级片一区| 含羞草久久爱69一区| 免播放器亚洲一区| 欧美日韩不卡在线| 亚洲欧美日韩综合国产aⅴ| 亚洲欧美国产高清| 激情五月婷婷综合| 亚洲日本成人女熟在线观看| 欧美日韩另类视频| 久久国产主播精品| 久久夜色精品亚洲噜噜国产mv| 一区二区三区不卡视频在线观看| 亚洲高清影视| 欧美日韩成人| 久久九九精品| 久久先锋影音av| 亚洲女ⅴideoshd黑人| 玖玖玖国产精品| 亚洲欧美日韩国产一区二区| 久久久久99| 久久精品视频一| 欧美精品九九| 久久夜色精品国产欧美乱| 欧美另类视频| 免费不卡在线视频| 国产日韩欧美一区二区| 久久精品国产91精品亚洲| 美女视频黄免费的久久| 99伊人成综合| 欧美一级在线亚洲天堂| 一区二区毛片| 卡通动漫国产精品| 欧美在线亚洲在线| 欧美色欧美亚洲另类二区| 毛片基地黄久久久久久天堂| 国产精品一区久久久久| 亚洲毛片一区| 亚洲精品国久久99热| 老司机精品福利视频| 久久永久免费| 含羞草久久爱69一区| 午夜欧美理论片| 午夜视频在线观看一区二区| 欧美日韩美女一区二区| 亚洲欧洲日本mm| 亚洲精一区二区三区| 久久理论片午夜琪琪电影网| 久久动漫亚洲| 国产欧美精品久久| 亚洲欧美日韩精品在线| 欧美一激情一区二区三区| 欧美午夜在线一二页| 一区二区日韩伦理片| 亚洲一区二区欧美| 欧美日韩综合在线免费观看| 亚洲日本激情| 亚洲先锋成人| 国产毛片精品国产一区二区三区| 99re66热这里只有精品4| 亚洲午夜精品网| 国产精品进线69影院| 一区二区三区视频在线| 亚洲一区二区免费在线| 欧美无乱码久久久免费午夜一区| 日韩系列在线| 亚洲女人av| 国产揄拍国内精品对白| 久久亚洲精品欧美| 欧美激情欧美激情在线五月| 日韩视频一区二区三区在线播放免费观看| 老色鬼久久亚洲一区二区| 亚洲国产精品123| 一本色道久久综合亚洲91| 欧美日韩一区二区三区免费| 亚洲一区二区三区在线视频| 久久天天躁狠狠躁夜夜爽蜜月| 亚洲国产精品视频| 欧美日韩一卡| 欧美一区二区精品在线| 欧美成人久久| 亚洲欧美日韩成人高清在线一区| 国产香蕉97碰碰久久人人| 免费日韩成人| 亚洲一区二区三区免费视频| 欧美激情第9页| 久久成人一区二区| 亚洲人成网站在线观看播放| 免费91麻豆精品国产自产在线观看| 亚洲日本中文字幕区| 国产精品麻豆成人av电影艾秋| 久久免费视频在线| 一区二区三区视频在线播放| 噜噜噜噜噜久久久久久91| 一本一本久久a久久精品综合麻豆| 一区二区高清| 国产日韩精品在线| 欧美大片在线观看一区二区| 亚洲午夜电影在线观看| 欧美99在线视频观看| 亚洲欧美日韩人成在线播放| 亚洲国产日韩一区| 国产精品夜夜夜一区二区三区尤| 蜜臀av国产精品久久久久| 亚洲欧美日韩电影| 99精品欧美一区二区蜜桃免费| 美女图片一区二区| 欧美一区二区三区四区在线观看地址 | 一区二区三区高清视频在线观看| 国产日韩欧美中文| 欧美四级在线观看| 欧美电影资源| 另类尿喷潮videofree| 欧美一区二区三区四区高清| 亚洲一区二区三区视频| 99re66热这里只有精品3直播| 亚洲国产精品免费|