欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++中關(guān)于委派(Delegates)的實(shí)現(xiàn)示例

 更新時(shí)間:2015年07月14日 11:36:59   投稿:goldensun  
這篇文章主要介紹了C++中關(guān)于委派(Delegates)的實(shí)現(xiàn)示例,針對(duì)C++11的一些新特性進(jìn)行講解,需要的朋友可以參考下

 介紹

在 C++ 中通過(guò)一個(gè)全局函數(shù)來(lái)綁定到對(duì)象的成員函數(shù)是很有用的,這個(gè)特性也存在于其他語(yǔ)言中,例如 C#的委派。在 C++ 中相當(dāng)于成員函數(shù)指針,但是 并沒(méi)有提供相應(yīng)的特性。在這篇文章中,我想提出一個(gè)簡(jiǎn)單的 C++ 委派的實(shí)現(xiàn),是用 C++ 成員函數(shù)指針和 C++11 的可變模板(variadic templates),目前這套實(shí)現(xiàn)方法僅支持 GNU C++ 4.7.0,在 Windows 下可使用 MinGW。

背景

在我的方法中獎(jiǎng)提供一個(gè)create_delegate函數(shù),可通過(guò)下面兩種方法來(lái)調(diào)用:

  create_delegate(&object, &member_function)
  create_delegate(&function)

第一種方法創(chuàng)建一個(gè)對(duì)象并提供一個(gè)operator()成員函數(shù),第二個(gè)方法生成一個(gè)函數(shù)指針,兩種方法都兼容 type function<...>.

示例程序

首先我們定義一個(gè)包含多個(gè)方法的類:
 

class A
{
  int i;
public:  
  A(int k):i(k) {}
 
  auto get()const ->int { return i;}  
  auto set(int v)->void { i = v;}
 
  auto inc(int g)->int& { i+=g; return i;}
  auto incp(int& g)->int& { g+=i; return g;}
 
  auto f5 (int a1, int a2, int a3, int a4, int a5)const ->int
  {
    return i+a1+a2+a3+a4+a5;
  }
 
  auto set_sum4(int &k, int a1, int a2, int a3, int a4)->void
  {
    i+=a1+a2+a3+a4;
    k = i;
  }
 
  auto f8 (int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8) const ->int
  {
    return i+a1+a2+a3+a4+a5+a6+a7+a8;
  }  
 
  static auto sqr(double x)->double { return x*x; }
};

請(qǐng)注意你并不需要一定使用 C++ 的 auto 函數(shù)語(yǔ)法,你也可以使用傳統(tǒng)的方法,然后我們使用下面方法創(chuàng)建一個(gè)類:

 

A a(11);

接下來(lái)我們創(chuàng)建委派:
 

auto set1 = create_delegate(&a,&A::set);
auto inc = create_delegate(&a,&A::inc);
std::function<int(int&)> incp = create_delegate(&a,&A::incp);
auto af5 = create_delegate(&a,&A::f5);
auto set_sum4= create_delegate(&a,&A::set_sum4);
auto af8 = create_delegate(&a,&A::f8);
auto sqr = create_delegate(&A::sqr); // static function </int(int&)>

 
set1(25);
int x = 5;
int k = inc(x);
k = incp(x);
std::cout << "a.get():" << a.get() << std::endl;
std::cout << "k: " << k << std::endl;
std::cout << "x: " << x << std::endl;
std::cout << "af5(1,2,3,4,5): " << af5(1,2,3,4,5) << std::endl;
 
set_sum4(x,1,2,3,20);
std::cout << "after set_sum4(x,1,2,3,20)" << std::endl;
std::cout << "a.get(): " << a.get() << std::endl;
std::cout << "x: " << x << std::endl;
std::cout << "af8(1,2,3,4,5,6,7,8): " << af8(1,2,3,4,5,6,7,8) << std::endl;
std::cout << "sqr(2.1): " << sqr(2.1) << std::endl;

 
執(zhí)行上述程序的打印結(jié)果如下:
 

a.get():30
k: 35
x: 35
af5(1,2,3,4,5): 45
after set_sum4(x,1,2,3,20)
a.get(): 56
x: 56
af8(1,2,3,4,5,6,7,8): 92
sqr(2.1): 4.41

關(guān)鍵點(diǎn)
對(duì)于一個(gè)不是 volatile 和 const 的簡(jiǎn)單函數(shù)而言,實(shí)現(xiàn)是非常簡(jiǎn)單的,我們只需要?jiǎng)?chuàng)建一個(gè)類保存兩個(gè)指針,一個(gè)是對(duì)象,另外一個(gè)是成員函數(shù):
 

template <class T, class R, class ... P>
struct _mem_delegate
{
  T* m_t;
  R (T::*m_f)(P ...);
  _mem_delegate(T* t, R (T::*f)(P ...) ):m_t(t),m_f(f) {}
  R operator()(P ... p)
  {
      return (m_t->*m_f)(p ...);
  }
}; 

可變模板 variadic template 允許定義任意個(gè)數(shù)和類型參數(shù)的operator()函數(shù),而create_function 實(shí)現(xiàn)只需簡(jiǎn)單返回該類的對(duì)象:

 

template <class T, class R, class ... P>
_mem_delegate<T,R,P ...> create_delegate(T* t, R (T::*f)(P ...))
{
  _mem_delegate<T,R,P ...> d(t,f);
  return d;
}

 
 

實(shí)際中,我們需要另外的三個(gè)實(shí)現(xiàn)用于覆蓋 const、volatile 和 const volatile 三種成員函數(shù),這也是為什么傳統(tǒng)使用 #define 宏很便捷的原因,讓你無(wú)需重寫代碼段,下面是完整的實(shí)現(xiàn):
 

template <class F>
F* create_delegate(F* f)
{
  return f;
}
#define _MEM_DELEGATES(_Q,_NAME)\
template <class T, class R, class ... P>\
struct _mem_delegate ## _NAME\
{\
  T* m_t;\
  R (T::*m_f)(P ...) _Q;\
  _mem_delegate ## _NAME(T* t, R (T::*f)(P ...) _Q):m_t(t),m_f(f) {}\
  R operator()(P ... p) _Q\
  {\
    return (m_t->*m_f)(p ...);\
  }\
};\
\
template <class T, class R, class ... P>\
  _mem_delegate ## _NAME<T,R,P ...> create_delegate(T* t, R (T::*f)(P ...) _Q)\
{\
  _mem_delegate ##_NAME<T,R,P ...> d(t,f);\
  return d;\
}
 
_MEM_DELEGATES(,Z)
_MEM_DELEGATES(const,X)
_MEM_DELEGATES(volatile,Y)
_MEM_DELEGATES(const volatile,W)

相關(guān)文章

  • C++實(shí)現(xiàn)簡(jiǎn)單校園導(dǎo)游系統(tǒng)

    C++實(shí)現(xiàn)簡(jiǎn)單校園導(dǎo)游系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡(jiǎn)單校園導(dǎo)游系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • opencv檢測(cè)直線方法之投影法

    opencv檢測(cè)直線方法之投影法

    這篇文章主要為大家詳細(xì)介紹了opencv檢測(cè)直線之投影法的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • C++11?中的override詳解

    C++11?中的override詳解

    這篇文章主要介紹了C++11?中的override詳解,本文以重寫虛函數(shù)時(shí),容易犯的四個(gè)錯(cuò)誤為例,結(jié)合示例代碼給大家詳細(xì)介紹,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • C++常用函數(shù)之XML JSON格式轉(zhuǎn)換問(wèn)題

    C++常用函數(shù)之XML JSON格式轉(zhuǎn)換問(wèn)題

    XML在Json出現(xiàn)前應(yīng)用很廣泛,靈活性好,應(yīng)用語(yǔ)言也沒(méi)有限制,發(fā)展了這么長(zhǎng)時(shí)間后xml標(biāo)準(zhǔn)已經(jīng)很臃腫。這篇文章主要介紹了C++常用函數(shù)之XML JSON格式轉(zhuǎn)換問(wèn)題,需要的朋友可以參考下
    2020-02-02
  • C/C++中抽象類詳解及其作用介紹

    C/C++中抽象類詳解及其作用介紹

    這篇文章主要介紹了C/C++中抽象類詳解及其作用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • QT獲取顯示當(dāng)前時(shí)間和日期的方法(用QTime,QDate和QDateTime)

    QT獲取顯示當(dāng)前時(shí)間和日期的方法(用QTime,QDate和QDateTime)

    獲取當(dāng)期日期時(shí)間在我們?nèi)粘i_(kāi)發(fā)中經(jīng)常會(huì)遇到,下面這篇文章主要給大家介紹了關(guān)于QT獲取顯示當(dāng)前時(shí)間和日期的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • 淺談C++中thread庫(kù)join和detach的區(qū)別

    淺談C++中thread庫(kù)join和detach的區(qū)別

    這篇文章主要為大家介紹了C++中thread庫(kù)join和detach的區(qū)別,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-11-11
  • C++算法實(shí)現(xiàn)leetcode 1252奇數(shù)值單元格數(shù)目

    C++算法實(shí)現(xiàn)leetcode 1252奇數(shù)值單元格數(shù)目

    這篇文章為大家主要介紹了C++實(shí)現(xiàn)leetcode 1252奇數(shù)值單元格的數(shù)目題解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • C語(yǔ)言volatile關(guān)鍵字的作用與示例

    C語(yǔ)言volatile關(guān)鍵字的作用與示例

    這篇文章主要介紹了C語(yǔ)言volatile關(guān)鍵字的作用,volatile提醒編譯器它后面所定義的變量隨時(shí)都有可能改變,因此編譯后的程序每次需要存儲(chǔ)或讀取這個(gè)變量的時(shí)候,都會(huì)直接從變量地址中讀取數(shù)據(jù)
    2023-04-04
  • C語(yǔ)言實(shí)現(xiàn)酒店預(yù)訂管理系統(tǒng)

    C語(yǔ)言實(shí)現(xiàn)酒店預(yù)訂管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)酒店預(yù)訂管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06

最新評(píng)論