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

posts - 17,  comments - 2,  trackbacks - 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); 

posted on 2008-11-07 00:24 BeyondCN 閱讀(256) 評論(0)  編輯 收藏 引用

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲欧美日韩天堂| 国产有码一区二区| 欧美人交a欧美精品| 欧美成人资源| 国产精品成人一区| 国产麻豆9l精品三级站| 狠狠色狠狠色综合日日tαg| 91久久午夜| 午夜精品久久久久久久久久久久久| 亚洲欧美日韩区| 欧美国产综合视频| 99综合精品| 久久久久久夜精品精品免费| 欧美精品 国产精品| 在线日韩av片| 午夜精品在线| 久久高清国产| 国产精品视频午夜| 一区二区三区国产| 久久综合伊人77777蜜臀| 亚洲日本一区二区| 欧美中文在线观看国产| 欧美激情一区二区三区| 欧美图区在线视频| 亚洲国产cao| 免费欧美高清视频| 亚洲一区二区三区激情| 母乳一区在线观看| 国产一区香蕉久久| 亚洲日本aⅴ片在线观看香蕉| 欧美日韩综合精品| 亚洲毛片一区| 欧美大片在线影院| 久久噜噜亚洲综合| 亚洲一二三区精品| 亚洲精品永久免费| 欧美日韩在线一二三| 欧美一区二区三区视频在线观看| 亚洲视频精品在线| 欧美日韩精品一区二区三区| 99热免费精品在线观看| 亚洲国产激情| 欧美超级免费视 在线| 香蕉成人久久| 欧美一区二区三区在线观看| 国内精品视频久久| 99精品福利视频| 亚洲国产成人精品久久| 欧美一区成人| 亚洲欧美日韩一区二区在线| 欧美激情91| 一区二区三区高清在线观看| 久久婷婷一区| 亚洲欧洲日韩在线| 欧美在线免费视频| 亚洲黄色在线看| 9久re热视频在线精品| 亚洲人成高清| 欧美国产91| 欧美激情在线狂野欧美精品| 一区在线观看| 99精品欧美一区二区三区综合在线| 亚洲黄色在线看| 蜜乳av另类精品一区二区| 亚洲欧洲美洲综合色网| 久久这里有精品视频| 99精品国产福利在线观看免费| 开心色5月久久精品| 欧美va天堂在线| 欧美视频免费在线| 日韩亚洲精品视频| 国内在线观看一区二区三区| 亚洲在线成人精品| 欧美中文在线观看| 狠狠久久亚洲欧美专区| 久久久久久久久久久久久女国产乱 | 久久精品欧美日韩| 麻豆91精品| 亚洲成人资源网| 国产精品一区二区三区久久久 | 亚洲国产aⅴ天堂久久| 亚洲美女色禁图| 欧美日韩国产综合一区二区| 99在线精品观看| 欧美一区二区三区在线观看| 国产亚洲激情在线| 亚洲精品国精品久久99热| 9色精品在线| 狂野欧美性猛交xxxx巴西| 亚洲第一毛片| 亚洲影院在线观看| 免费日韩av电影| 一本久久知道综合久久| 亚洲日韩欧美视频一区| 久久国产66| 亚洲精品123区| 亚洲高清成人| 欧美午夜精品久久久久久孕妇| 亚洲一区二区三区中文字幕在线| 久久久久91| 国产精品综合| 欧美sm视频| 亚洲欧美国产77777| 亚洲永久在线观看| 在线观看亚洲视频| 欧美一区二区精品| 亚洲国产一区二区a毛片| 今天的高清视频免费播放成人 | 正在播放欧美视频| 久久婷婷色综合| 国产拍揄自揄精品视频麻豆| 99精品热视频| 老司机精品导航| 亚洲一区二区日本| 亚洲国产欧美日韩另类综合| 欧美吻胸吃奶大尺度电影| 久久色在线播放| 午夜激情综合网| 9人人澡人人爽人人精品| 猛男gaygay欧美视频| 亚洲欧美成人网| 亚洲精品一区二区三区四区高清 | 欧美黄污视频| 久久精品国产2020观看福利| 一本综合精品| 亚洲精品影视在线观看| 亚洲福利视频一区| 免费亚洲一区| 免费在线观看成人av| 久久精品国产v日韩v亚洲 | 久久久另类综合| 怡红院精品视频| 国产午夜精品一区二区三区欧美 | 99re6热只有精品免费观看 | 亚洲欧美偷拍卡通变态| 日韩一区二区精品视频| 91久久精品久久国产性色也91| 国产亚洲综合性久久久影院| 国产精品伊人日日| 国产精品久久久久久久久动漫| 欧美伦理视频网站| 欧美极品在线播放| 欧美精品大片| 欧美国产日韩a欧美在线观看| 欧美1区视频| 欧美mv日韩mv国产网站| 欧美福利视频| 欧美激情综合色| 欧美日韩综合网| 国产精品乱码久久久久久| 久久精品中文字幕免费mv| 亚洲青涩在线| 亚洲欧洲一区二区在线播放 | 久久久xxx| 免费成人黄色片| 欧美黄色片免费观看| 亚洲国产免费| 一本色道久久综合亚洲精品小说| 一区电影在线观看| 欧美亚洲一区二区三区| 久久中文字幕导航| 欧美激情 亚洲a∨综合| 欧美色大人视频| 国产精品网站在线播放| 狠狠色综合网| 亚洲欧洲日本在线| 亚洲一区二区三区四区视频| 欧美一级大片在线免费观看| 久久精品在线免费观看| 亚洲第一福利社区| 一本一本久久a久久精品牛牛影视| 亚洲综合色丁香婷婷六月图片| 亚洲欧美视频一区二区三区| 欧美制服丝袜第一页| 欧美激情1区| 国产视频一区三区| 亚洲精品一二| 欧美一区二区三区男人的天堂| 美国三级日本三级久久99| 亚洲卡通欧美制服中文| 欧美一区二区三区电影在线观看| 老司机成人在线视频| 欧美日韩国产精品专区| 国产一区 二区 三区一级| 91久久精品美女高潮| 欧美在线亚洲在线| 亚洲精品裸体| 久久九九免费视频| 欧美系列精品| 亚洲精品欧美一区二区三区| 久久精品色图| 99re66热这里只有精品3直播| 久久精品99国产精品日本| 国产精品成人一区二区| 亚洲国产精品尤物yw在线观看| 亚洲欧美色一区| 亚洲麻豆av| 欧美aa在线视频| 精品二区视频| 欧美在线视频一区二区|