溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C++11?std::function和std::bind如何使用

發(fā)布時(shí)間:2023-03-22 16:41:37 來源:億速云 閱讀:201 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹了C++11 std::function和std::bind如何使用的相關(guān)知識,內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇C++11 std::function和std::bind如何使用文章都會有所收獲,下面我們一起來看看吧。

    概述

    C++11中的std::functionstd::bind是函數(shù)對象的重要組成部分,它們可以用于將函數(shù)和參數(shù)綁定在一起,形成一個(gè)可調(diào)用的對象。
    std::function可以存儲任意可調(diào)用對象,包括函數(shù)指針、函數(shù)對象、lambda表達(dá)式等,而std::bind則可以將函數(shù)和參數(shù)綁定在一起,形成一個(gè)新的可調(diào)用對象。它們的使用可以大大簡化代碼,提高代碼的可讀性和可維護(hù)性。

    可調(diào)用對象

    C++中有如下幾種可調(diào)用對象,函數(shù)、函數(shù)指針、lambda表達(dá)式、bind對象、函數(shù)對象。
    其中,lambda表達(dá)式和bind對象是C++11標(biāo)準(zhǔn)中提出的(bind機(jī)制并不是新標(biāo)準(zhǔn)中首次提出,而是對舊版本中bind1st和bind2st的合并)。

    std::function

    std::function是一個(gè)可調(diào)用對象包裝器,是一個(gè)類模板,可以容納除了類成員函數(shù)指針之外的所有可調(diào)用對象,它可以用統(tǒng)一的方式處理函數(shù)、函數(shù)對象、函數(shù)指針,并允許保存和延遲它們的執(zhí)行。
    使用std::function可以實(shí)現(xiàn)回調(diào)函數(shù)、事件處理等功能。

    std::function函數(shù)原型

    #include <functional>
    template<class R, class... Args>
    class function<R(Args...)>;
    //其中,R 表示返回值類型,Args... 表示參數(shù)類型列表。
    //例如,function<int(float, double)> 表示一個(gè)返回值為 int,接受一個(gè) float 和一個(gè) double 類型參數(shù)的函數(shù)對象。

    std::function的主要作用

    • 對C++中各種可調(diào)用實(shí)體(普通函數(shù)、Lambda表達(dá)式、函數(shù)指針、以及其它函數(shù)對象等)的封裝,形成一個(gè)新的可調(diào)用的std::function對象,簡化調(diào)用;

    • 對C++中現(xiàn)有的可調(diào)用實(shí)體的一種類型安全的包裹(如:函數(shù)指針這類可調(diào)用實(shí)體,是類型不安全的)。

    • 將函數(shù)作為參數(shù)傳遞給其他函數(shù);

    • 將函數(shù)作為返回值返回;

    • 將函數(shù)對象作為參數(shù)傳遞給其他函數(shù);

    • 將函數(shù)對象作為返回值返回。

    //例如,定義一個(gè)返回值為int,參數(shù)為兩個(gè)int的函數(shù)對象: 
    std::function<int(int, int)>func; 
    
    //可以將一個(gè)函數(shù)指針或lambda表達(dá)式賦值給函數(shù)對象: 
    int add(int a, int b) { return a +b; } 
    func = add; // 函數(shù)指針賦值 
    func = [](int a, int b) { return a + b; };// lambda表達(dá)式賦值 
    
    //調(diào)用函數(shù)對象可以使用operator(),例如:
    int result = func(1, 2); // 調(diào)用add函數(shù),返回3

    std::function的優(yōu)缺點(diǎn)

    • 優(yōu)點(diǎn):

    可以方便地實(shí)現(xiàn)回調(diào)函數(shù)、事件處理等功能,同時(shí)也可以用于實(shí)現(xiàn)函數(shù)對象的封裝和傳遞。

    • 缺點(diǎn):

    它的使用會帶來一定的性能開銷,因?yàn)樗枰谶\(yùn)行時(shí)進(jìn)行類型檢查和動(dòng)態(tài)分配內(nèi)存。
    此外,如果使用不當(dāng),也容易引起內(nèi)存泄漏和對象生命周期管理的問題。

    std::bind

    std::function是一個(gè)可調(diào)用對象包裝器,是一個(gè)類模板,可以容納除了類成員函數(shù)指針之外的所有可調(diào)用對象,它可以用統(tǒng)一的方式處理函數(shù)、函數(shù)對象、函數(shù)指針,并允許保存和延遲它們的執(zhí)行。

    std::bind函數(shù)原型

    template<class F, class... Args> 
    /unspecified/ bind(F&& f, Args&&... args);
    //其中,F(xiàn)是要綁定的函數(shù)對象,Args是要綁定的參數(shù)。返回值是一個(gè)新的可調(diào)用對象,可以直接調(diào)用或者存儲起來后再調(diào)用。

    std::bind的主要作用

    • 將可調(diào)用對象和其參數(shù)綁定成一個(gè)仿函數(shù);

    • 只綁定部分參數(shù),減少可調(diào)用對象傳入的參數(shù)。

    • 綁定函數(shù)對象的參數(shù),生成一個(gè)新的可調(diào)用對象,可以方便地將函數(shù)對象作為參數(shù)傳遞給其它函數(shù)。

    • 可以將成員函數(shù)綁定到對象上,生成一個(gè)新的可調(diào)用對象,方便地調(diào)用成員函數(shù)。

    • 可以將成員函數(shù)綁定到對象指針上,生成一個(gè)新的可調(diào)用對象,方便地調(diào)用成員函數(shù)。

    • 可以將成員函數(shù)綁定到對象引用上,生成一個(gè)新的可調(diào)用對象,方便地調(diào)用成員函數(shù)。

    • 可以將函數(shù)對象綁定到函數(shù)指針上,生成一個(gè)新的可調(diào)用對象,方便地調(diào)用函數(shù)對象。

    • 可以將函數(shù)對象綁定到函數(shù)引用上,生成一個(gè)新的可調(diào)用對象,方便地調(diào)用函數(shù)對象。

    • 可以將函數(shù)對象綁定到std::function對象上,生成一個(gè)新的可調(diào)用對象,方便地調(diào)用函數(shù)對象。

    例如,我們有一個(gè)函數(shù)對象:
    void foo(int a, int b, int c) { std::cout << a << " " << b << " " << c << std::endl; }
    我們可以使用std::bind將它綁定到一些參數(shù)上:
    auto f = std::bind(foo, 1, 2, 3);
    這里,f是一個(gè)新的可調(diào)用對象,它綁定了foo函數(shù)和參數(shù)1、2、3。我們可以像調(diào)用原始函數(shù)對象一樣調(diào)用它:
    f(); // 輸出:1 2 3
    我們也可以只綁定部分參數(shù):
    auto g = std::bind(foo, 1, std::placeholders::_1, 3);
    這里,std::placeholders::_1表示占位符,它表示在調(diào)用g時(shí),第二個(gè)參數(shù)會被傳遞給foo函數(shù)。我們可以這樣調(diào)用g:
    g(2); // 輸出:1 2 3
    這就是std::bind的基本用法。它可以方便地將函數(shù)對象和參數(shù)綁定在一起,生成一個(gè)新的可調(diào)用對象。

    std::bind的優(yōu)缺點(diǎn)

    優(yōu)點(diǎn):

    可以方便地實(shí)現(xiàn)函數(shù)對象的復(fù)用和參數(shù)的延遲綁定,從而提高代碼的可讀性和可維護(hù)性。

    缺點(diǎn):

    可能會導(dǎo)致代碼的復(fù)雜性增加,特別是當(dāng)參數(shù)較多時(shí),需要謹(jǐn)慎使用。

    代碼示例

    #pragma once
    
    #include <iostream>
    #include <functional>
    class A {
    public:
     bool TESTA(int, char*, int) { /* implementation */ }
    };
    
    class B {
    public:
     bool TESTB(std::function<bool(int, char*, int)> func) { /* implementation */ }
    };
    
    int main() {
     A objA;
     B objB;
     auto lambda = [](int a, char* b, int c) { /* implementation */ };
     objB.TESTB(lambda);
     objB.TESTB(std::bind(&A::TESTA, &objA, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
     return 0;
    }

    關(guān)于“C++11 std::function和std::bind如何使用”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“C++11 std::function和std::bind如何使用”知識都有一定的了解,大家如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI