程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++中關於委派(Delegates)的完成示例

C++中關於委派(Delegates)的完成示例

編輯:關於C++

C++中關於委派(Delegates)的完成示例。本站提示廣大學習愛好者:(C++中關於委派(Delegates)的完成示例)文章只能為提供參考,不一定能成為您想要的結果。以下是C++中關於委派(Delegates)的完成示例正文


 引見

在 C++ 中經由過程一個全局函數來綁定到對象的成員函數是很有效的,這個特征也存在於其他說話中,例如 C#的委派。在 C++ 中相當於成員函數指針,然則 並沒有供給響應的特征。在這篇文章中,我想提出一個簡略的 C++ 委派的完成,是用 C++ 成員函數指針和 C++11 的可變模板(variadic templates),今朝這套完成辦法僅支撐 GNU C++ 4.7.0,在 Windows 下可以使用 MinGW。

配景

在我的辦法中獎供給一個create_delegate函數,可經由過程上面兩種辦法來挪用:

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

第一種辦法創立一個對象並供給一個operator()成員函數,第二個辦法生成一個函數指針,兩種辦法都兼容 type function<...>.

示例法式

起首我們界說一個包括多個辦法的類:
 

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; }
};

請留意你其實不須要必定應用 C++ 的 auto 函數語法,你也能夠應用傳統的辦法,然後我們應用上面辦法創立一個類:

 

A a(11);

接上去我們創立委派:
 

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;

 
履行上述法式的打印成果以下:
 

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

症結點
關於一個不是 volatile 和 const 的簡略函數而言,完成長短常簡略的,我們只須要創立一個類保留兩個指針,一個是對象,別的一個是成員函數:
 

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 許可界說隨意率性個數和類型參數的operator()函數,而create_function 完成只需簡略前往該類的對象:

 

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;
}

 
 

現實中,我們須要別的的三個完成用於籠罩 const、volatile 和 const volatile 三種成員函數,這也是為何傳統應用 #define 宏很便捷的緣由,讓你無需重寫代碼段,上面是完全的完成:
 

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)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved