本篇文章給大家分享的是有關function與bind怎么在C++中使用,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

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;
}可將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;
}綁定類成員重載函數的難點在于如何區分函數綁定的是哪一個成員函數。這時需要在函數指針前指定其類型。下面是一個簡單的例子:
#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, &g, 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++中使用-創新互聯
鏈接地址:http://www.yijiale78.com/article26/cdpecg.html
成都網站建設公司_創新互聯,為您提供域名注冊、網站改版、關鍵詞優化、網站設計公司、網站建設、手機網站建設
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯