std::function是函數(shù)模板類(是一個(gè)類)。包含在#include
typedef? void(*ptr)(int,int)// 這里的ptr就是一個(gè)函數(shù)指針
而使用了std::function這個(gè)類的時(shí)候,我們可以這樣使用,來替換函數(shù)指針。例如
std::functionfunc;
std::function 是一種通用、多態(tài)的函數(shù)封裝。它的實(shí)例能存儲(chǔ)、復(fù)制及調(diào)用任何可調(diào)用 (Callable) 目標(biāo)——函數(shù)、 lambda 表達(dá)式、 bind 表達(dá)式或其他函數(shù)對(duì)象,還有指向成員函數(shù)指針和指向數(shù)據(jù)成員指針。
它也是對(duì) C++ 中現(xiàn)有的可調(diào)用實(shí)體的一種類型安全的包裹(相對(duì)來說,函數(shù)指針的調(diào)用不是類型安全的)
二、與std::bind結(jié)合可以將std::bind函數(shù)看作一個(gè)通用的函數(shù)適配器,它接受一個(gè)可調(diào)用對(duì)象,生成一個(gè)新的可調(diào)用對(duì)象來“適應(yīng)”原對(duì)象的參數(shù)列表。
std::bind將可調(diào)用對(duì)象與其參數(shù)一起進(jìn)行綁定,綁定后的結(jié)果可以使用std::function保存。std::bind主要有以下兩個(gè)作用:
1、std::bind綁定普通函數(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;
}
2、std::bind綁定一個(gè)成員函數(shù)
struct Foo {
void print_sum(int n1, int n2)
{
std::cout<< n1+n2<< '\n';
}
int data = 10;
};
int main()
{
Foo foo;
auto f = std::bind(&Foo::print_sum, &foo, 95, std::placeholders::_1);
f(5); // 100
}
三、實(shí)例#include#include#include#include
運(yùn)行后控制臺(tái)打印如下
四、總結(jié)簡(jiǎn)而言之,std::function 就是函數(shù)的容器。比傳統(tǒng)的函數(shù)指針功能更強(qiáng)大,配合上bind能夠解決成員函數(shù)指針跟隨類的弊端
弊端可參考如下:
【C++】std::function與函數(shù)指針_芒果黑的博客-博客_c++ function 轉(zhuǎn)函數(shù)指針
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧