1. 程式人生 > 程式設計 >C++類過載函式的function和bind使用示例

C++類過載函式的function和bind使用示例

在沒有C++11的std::function和std::bind之前,我們使用函式指標的方式是五花八門,結構很繁瑣難懂。C++11中提供了std::function和std::bind統一了可呼叫物件的各種操作。

1.std::function簡介

std::function首先是可呼叫物件,本質上生成了一個類(仿函式)

簡單的使用如下程式碼

#include <unordered_map>
#include <iostream>
#include <functional>
using namespace std;
int func(int a)
{
  cout << a << __FUNCTION__ << endl;
  return a;
}
int main()
{
  using NewType = function<int(int)>; // function本質上生成了一個類(仿函式)
  NewType f1 = func;
  f1(55);
  return 0;
}

2.std::function與std::bind聯合使用繫結類成員函式

可將std::bind函式看作一個通用的函式介面卡,它接受一個可呼叫物件,生成一個新的可呼叫物件來“適應”原物件的引數列表。

std::bind將可呼叫物件與其引數一起進行繫結,繫結後的結果可以使用std::function儲存。std::bind主要有以下兩個作用:

  • 將可呼叫物件和其引數繫結成一個防函式;
  • 只繫結部分引數,減少可呼叫物件傳入的引數。

一個簡單的例子:

#include <unordered_map>
#include <iostream>
#include <functional>
using namespace std;
class A
{
public:
  int funcA(int a)
  {
    cout << "111 " << a << endl;
    return 1;
  }
};

int main()
{
  A a;
  using NewType = function<int(int)>; // function本質上生成了一個類(仿函式)
  NewType f1 = bind(&A::funcA,&a,std::placeholders::_1);
  f1(55);
  return 0;
}

3.std::function與std::bind聯合使用繫結類成員過載函式

繫結類成員過載函式的難點在於如何區分函式繫結的是哪一個成員函式。這時需要在函式指標前指定其型別。下面是一個簡單的例子:

#include <unordered_map>
#include <iostream>
#include <functional>
using namespace std;
class A
{
public:
  int funcA(int a)
  {
    cout << "111 " << a << endl;
    return 1;
  }
  int funcA(int a,int b)
  {
    cout << "222 " << a << endl;
    return a + b;
  }
};

int main()
{
  unordered_map<int,void *> funcMap;//嘗試將其轉載入map中
  A g;
  using NewType1 = function<int(int,int)>; 
  using NewType2 = function<int(int)>;
  NewType1* type1 = new NewType1; // function本質上生成了一個類(仿函式)
  NewType2* type2 = new NewType2;
  //獲取過載函式指標
  *type1 = std::bind((int(A::*)(int,int)) & A::funcA,&g,std::placeholders::_1,std::placeholders::_2);
  *type2 = std::bind((int(A::*)(int)) & A::funcA,std::placeholders::_1);
  //
  funcMap[1] = type1; //
  funcMap[2] = type2; //
  
  // 使用
  void* s1 = funcMap[1];
  void* s2 = funcMap[2];
  NewType1* f1 = (NewType1*)(s1);
  NewType2* f2 = (NewType2*)(s2);
  (*f1)(1,5);
  (*f2)(55);
  return 0;
}

最近在工作中,遇到了需要編寫大量重複程式碼的工作,於是嘗試將這些過載函式放入對映中,只需要添加註冊函式,最終可以統一使用對映表呼叫所需要的函式,function與bind方法給了我幫助,我也將程式碼分享給大家。

以上就是C++類過載函式的function和bind使用示例的詳細內容,更多關於C++類過載函式的function和bind的資料請關注我們其它相關文章!