中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

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

發布時間:2023-03-22 16:41:37 來源:億速云 閱讀:207 作者:iii 欄目:開發技術

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

    概述

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

    可調用對象

    C++中有如下幾種可調用對象,函數、函數指針、lambda表達式、bind對象、函數對象
    其中,lambda表達式和bind對象是C++11標準中提出的(bind機制并不是新標準中首次提出,而是對舊版本中bind1st和bind2st的合并)。

    std::function

    std::function是一個可調用對象包裝器,是一個類模板,可以容納除了類成員函數指針之外的所有可調用對象,它可以用統一的方式處理函數、函數對象、函數指針,并允許保存和延遲它們的執行。
    使用std::function可以實現回調函數、事件處理等功能。

    std::function函數原型

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

    std::function的主要作用

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

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

    • 將函數作為參數傳遞給其他函數;

    • 將函數作為返回值返回;

    • 將函數對象作為參數傳遞給其他函數;

    • 將函數對象作為返回值返回。

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

    std::function的優缺點

    • 優點:

    可以方便地實現回調函數、事件處理等功能,同時也可以用于實現函數對象的封裝和傳遞。

    • 缺點:

    它的使用會帶來一定的性能開銷,因為它需要在運行時進行類型檢查和動態分配內存。
    此外,如果使用不當,也容易引起內存泄漏和對象生命周期管理的問題。

    std::bind

    std::function是一個可調用對象包裝器,是一個類模板,可以容納除了類成員函數指針之外的所有可調用對象,它可以用統一的方式處理函數、函數對象、函數指針,并允許保存和延遲它們的執行。

    std::bind函數原型

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

    std::bind的主要作用

    • 將可調用對象和其參數綁定成一個仿函數;

    • 只綁定部分參數,減少可調用對象傳入的參數。

    • 綁定函數對象的參數,生成一個新的可調用對象,可以方便地將函數對象作為參數傳遞給其它函數。

    • 可以將成員函數綁定到對象上,生成一個新的可調用對象,方便地調用成員函數。

    • 可以將成員函數綁定到對象指針上,生成一個新的可調用對象,方便地調用成員函數。

    • 可以將成員函數綁定到對象引用上,生成一個新的可調用對象,方便地調用成員函數。

    • 可以將函數對象綁定到函數指針上,生成一個新的可調用對象,方便地調用函數對象。

    • 可以將函數對象綁定到函數引用上,生成一個新的可調用對象,方便地調用函數對象。

    • 可以將函數對象綁定到std::function對象上,生成一個新的可調用對象,方便地調用函數對象。

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

    std::bind的優缺點

    優點:

    可以方便地實現函數對象的復用和參數的延遲綁定,從而提高代碼的可讀性和可維護性。

    缺點:

    可能會導致代碼的復雜性增加,特別是當參數較多時,需要謹慎使用。

    代碼示例

    #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;
    }

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

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    城市| 林州市| 鲁甸县| 从江县| 大石桥市| 普安县| 临沭县| 桃江县| 台江县| 和政县| 大余县| 宿迁市| 滦平县| 江川县| 靖宇县| 泾阳县| 西平县| 麻栗坡县| 乐陵市| 自治县| 萝北县| 黄陵县| 阿拉善右旗| 沽源县| 浑源县| 汤原县| 长岭县| 金乡县| 大渡口区| 叙永县| 临桂县| 宁津县| 牡丹江市| 从化市| 明溪县| 遂平县| 开鲁县| 巴塘县| 通榆县| 托里县| 湖北省|