欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++ std::function詳解

 更新時(shí)間:2021年10月11日 10:50:07   作者:物隨心轉(zhuǎn)  
類模版std::function是一種通用的多態(tài)函數(shù)包裝器std::function的實(shí)例可以對任何可以調(diào)用的目標(biāo)實(shí)體進(jìn)行存儲、復(fù)制、和調(diào)用操作,本文詳細(xì)的介紹一下,感興趣的可以了解一下

一、介紹

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

typedef  void(*ptr)(int,int)// 這里的ptr就是一個(gè)函數(shù)指針

而使用了std::function這個(gè)類的時(shí)候,我們可以這樣使用,來替換函數(shù)指針。例如:

std::function<void(int ,int)> func;

std::function 的實(shí)例能存儲、復(fù)制及調(diào)用任何可調(diào)用 (Callable) 目標(biāo)——函數(shù)、 lambda 表達(dá)式、 bind 表達(dá)式或其他函數(shù)對象,還有指向成員函數(shù)指針和指向數(shù)據(jù)成員指針。

它也是對 C++ 中現(xiàn)有的可調(diào)用實(shí)體的一種類型安全的包裹(相對來說,函數(shù)指針的調(diào)用不是類型安全的)

二、實(shí)例

    #include <iostream>  
    #include <vector>  
    #include <list>  
    #include <map>  
    #include <set>  
    #include <string>  
    #include <algorithm>  
    #include <functional>  
    #include <memory>  
    using namespace std;  
    //聲明一個(gè)模板  
    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表達(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)行結(jié)果

三、與std::bind的區(qū)別

可將std::bind函數(shù)看作一個(gè)通用的函數(shù)適配器,它接受一個(gè)可調(diào)用對象,生成一個(gè)新的可調(diào)用對象來“適應(yīng)”原對象的參數(shù)列表。

std::bind將可調(diào)用對象與其參數(shù)一起進(jìn)行綁定,綁定后的結(jié)果可以使用std::function保存。std::bind主要有以下兩個(gè)作用:

  • 將可調(diào)用對象和其參數(shù)綁定成一個(gè)仿函數(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++ std::function的用法詳解

C++11 中的std::function和std::bind詳解

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

最新評論