最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

 介紹

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

背景

在我的方法中獎提供一個create_delegate函數(shù),可通過下面兩種方法來調(diào)用:

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

第一種方法創(chuàng)建一個對象并提供一個operator()成員函數(shù),第二個方法生成一個函數(shù)指針,兩種方法都兼容 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 函數(shù)語法,你也可以使用傳統(tǒng)的方法,然后我們使用下面方法創(chuàng)建一個類:

 

A a(11);

接下來我們創(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

關鍵點
對于一個不是 volatile 和 const 的簡單函數(shù)而言,實現(xiàn)是非常簡單的,我們只需要創(chuàng)建一個類保存兩個指針,一個是對象,另外一個是成員函數(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 允許定義任意個數(shù)和類型參數(shù)的operator()函數(shù),而create_function 實現(xiàn)只需簡單返回該類的對象:

 

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

 
 

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

相關文章

  • C++返回值類型后置實現(xiàn)(跟蹤返回值類型)

    C++返回值類型后置實現(xiàn)(跟蹤返回值類型)

    本文主要介紹了C++返回值類型后置實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • C++中的auto_ptr智能指針的作用及使用方法詳解

    C++中的auto_ptr智能指針的作用及使用方法詳解

    這篇文章主要介紹了C++中的auto_ptr智能指針的作用及使用方法詳解的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-07-07
  • 詳解C語言正確使用extern關鍵字

    詳解C語言正確使用extern關鍵字

    這篇文章主要介紹了C語言正確使用extern關鍵字,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • c++代碼各種注釋示例詳解

    c++代碼各種注釋示例詳解

    大家好,本篇文章主要講的是c++代碼各種注釋示例詳解,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • C++采用TLS線程局部存儲的用法實例

    C++采用TLS線程局部存儲的用法實例

    這篇文章主要介紹了C++采用TLS線程局部存儲的用法實例,詳細講述了TLS索引及線程的操作,非常具有實用價值,需要的朋友可以參考下
    2014-10-10
  • 簡介C++編程中的運算符重載

    簡介C++編程中的運算符重載

    這篇文章簡單介紹了C++編程中的運算符重載,是C++入門學習中的基礎知識,需要的朋友可以參考下
    2015-09-09
  • C++ 實現(xiàn)對象池的具體方法

    C++ 實現(xiàn)對象池的具體方法

    本文主要介紹了C++ 實現(xiàn)對象池的具體方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C++深入分析數(shù)據(jù)在內(nèi)存中的存儲形態(tài)

    C++深入分析數(shù)據(jù)在內(nèi)存中的存儲形態(tài)

    使用編程語言進行編程時,需要用到各種變量來存儲各種信息。變量保留的是它所存儲的值的內(nèi)存位置。這意味著,當您創(chuàng)建一個變量時,就會在內(nèi)存中保留一些空間。您可能需要存儲各種數(shù)據(jù)類型的信息,操作系統(tǒng)會根據(jù)變量的數(shù)據(jù)類型,來分配內(nèi)存和決定在保留內(nèi)存中存儲什么
    2023-01-01
  • 深入理解:Java是類型安全的語言,而C++是非類型安全的語言

    深入理解:Java是類型安全的語言,而C++是非類型安全的語言

    本篇文章是對Java是類型安全的語言,而C++是非類型安全的語言進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06
  • Matlab實現(xiàn)同步子圖視角的方法詳解

    Matlab實現(xiàn)同步子圖視角的方法詳解

    這篇文章主要和大家分享三個可以Matlab中更簡便實現(xiàn)同步子圖視角的技巧,文中的示例代碼講解詳細,感興趣的小伙伴可以學習一下
    2022-06-06

最新評論

布拖县| 资中县| 马关县| 平利县| 高安市| 策勒县| 方城县| 曲水县| 雷州市| 彭山县| 东兰县| 理塘县| 河曲县| 乐山市| 柏乡县| 天气| 政和县| 宁夏| 甘洛县| 南涧| 孟州市| 手游| 婺源县| 那坡县| 青龙| 乐陵市| 吉木乃县| 鲁山县| 应城市| 陇川县| 高阳县| 海城市| 峡江县| 海门市| 绥中县| 开原市| 卓资县| 扎鲁特旗| 镶黄旗| 宝坻区| 印江|