C++ std::function詳解
一、介紹
std::function是函數(shù)模板類(是一個類)。包含在#include <functional> 中。以前沒有這個類的時候,我們在想定義一個回調(diào)函數(shù)指針,非常的麻煩。我們通常這樣的定義:
typedef void(*ptr)(int,int)// 這里的ptr就是一個函數(shù)指針
而使用了std::function這個類的時候,我們可以這樣使用,來替換函數(shù)指針。例如:
std::function<void(int ,int)> func;
std::function 的實例能存儲、復制及調(diào)用任何可調(diào)用 (Callable) 目標——函數(shù)、 lambda 表達式、 bind 表達式或其他函數(shù)對象,還有指向成員函數(shù)指針和指向數(shù)據(jù)成員指針。
它也是對 C++ 中現(xiàn)有的可調(diào)用實體的一種類型安全的包裹(相對來說,函數(shù)指針的調(diào)用不是類型安全的)
二、實例
#include <iostream>
#include <vector>
#include <list>
#include <map>
#include <set>
#include <string>
#include <algorithm>
#include <functional>
#include <memory>
using namespace std;
//聲明一個模板
typedef std::function<int(int)> Functional;
//normal function
int TestFunc(int a)
{
return a;
}
//lambda expression
auto lambda = [](int a)->int{return a;};
//functor仿函數(shù)
class Functor
{
public:
int operator() (int a)
{
return a;
}
};
//類的成員函數(shù)和類的靜態(tài)成員函數(shù)
class CTest
{
public:
int Func(int a)
{
return a;
}
static int SFunc(int a)
{
return a;
}
};
int main(int argc, char* argv[])
{
//封裝普通函數(shù)
Functional obj = TestFunc;
int res = obj(0);
cout << "normal function : " << res << endl;
//封裝lambda表達式
obj = lambda;
res = obj(1);
cout << "lambda expression : " << res << endl;
//封裝仿函數(shù)
Functor functorObj;
obj = functorObj;
res = obj(2);
cout << "functor : " << res << endl;
//封裝類的成員函數(shù)和static成員函數(shù)
CTest t;
obj = std::bind(&CTest::Func, &t, std::placeholders::_1);
res = obj(3);
cout << "member function : " << res << endl;
obj = CTest::SFunc;
res = obj(4);
cout << "static member function : " << res << endl;
return 0;
}
運行結果

三、與std::bind的區(qū)別
可將std::bind函數(shù)看作一個通用的函數(shù)適配器,它接受一個可調(diào)用對象,生成一個新的可調(diào)用對象來“適應”原對象的參數(shù)列表。
std::bind將可調(diào)用對象與其參數(shù)一起進行綁定,綁定后的結果可以使用std::function保存。std::bind主要有以下兩個作用:
- 將可調(diào)用對象和其參數(shù)綁定成一個仿函數(shù);
- 只綁定部分參數(shù),減少可調(diào)用對象傳入的參數(shù)。
double my_divide(double x, double y) { return x / y; };
int main(int argc, char* argv[])
{
auto fn_half = std::bind(my_divide, std::placeholders::_1, 2);
std::cout << fn_half(10) << '\n'; // 輸出為5
return 0;
}
參考:
C++11 中的std::function和std::bind詳解
總結
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內(nèi)容!
相關文章
windows 下C++生成Dump調(diào)試文件與分析
dump文件是C++程序發(fā)生異常時,保存當時程序運行狀態(tài)的文件,是調(diào)試異常程序重要的方法,所以程序崩潰時,除了日志文件,dump文件便成了我們查找錯誤的最后一根救命的稻草,這篇文章主要介紹了windows 下C++生成Dump調(diào)試文件與分析,需要的朋友可以參考下2023-04-04
C語言數(shù)組實現(xiàn)公交車管理系統(tǒng)
這篇文章主要介紹了C語言數(shù)組實現(xiàn)公交車管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-12-12
Qt實現(xiàn)SqlTableModel映射組件應用小結
在Qt中提供了QSqlTableModel模型類,它為開發(fā)者提供了一種直觀的方式來與數(shù)據(jù)庫表格進行交互,本文就來介紹一下Qt實現(xiàn)SqlTableModel映射組件應用小結,感興趣的可以了解一下2023-12-12
C++ 使用CRC32檢測內(nèi)存映像完整性的實現(xiàn)步驟
當我們使用動態(tài)補丁的時候,那么內(nèi)存中同樣不存在校驗效果,也就無法抵御對方動態(tài)修改機器碼了,為了防止解密者直接對內(nèi)存打補丁,我們需要在硬盤校驗的基礎上,增加內(nèi)存校驗,防止動態(tài)補丁的運用。2021-06-06
C語言編寫基于TCP和UDP協(xié)議的Socket通信程序示例
這篇文章主要介紹了C語言編寫基于TCP和UDP協(xié)議的Socket通信程序示例,其中TCP的客戶端與服務器端采用多線程實現(xiàn),需要的朋友可以參考下2016-03-03

