真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

c++std::funciona代替函數(shù)指針——結(jié)合std::bind-創(chuàng)新互聯(lián)

一、介紹std::function

std::function是函數(shù)模板類(是一個(gè)類)。包含在#include中。以前沒有這個(gè)類的時(shí)候,我們?cè)谙攵x一個(gè)回調(diào)函數(shù)指針,非常的麻煩。我們通常這樣的定義:

陽東網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),陽東網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為陽東近1000家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)公司要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的陽東做網(wǎng)站的公司定做!
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è)作用:

  • 將可調(diào)用對(duì)象和其參數(shù)綁定成一個(gè)仿函數(shù);
  • 只綁定部分參數(shù),減少可調(diào)用對(duì)象傳入的參數(shù)。

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#include#include#include   
    #include#includeusing namespace std;  
    //聲明一個(gè)模板  
    typedef std::functionFunctional;  
    //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表達(dá)式  
        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;  
    }

運(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)查看詳情吧


當(dāng)前名稱:c++std::funciona代替函數(shù)指針——結(jié)合std::bind-創(chuàng)新互聯(lián)
當(dāng)前網(wǎng)址:http://weahome.cn/article/dsssej.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部