最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++小利器之std::bind參數(shù)綁定包裝器的使用詳解

 更新時間:2023年12月22日 08:51:41   作者:ENG八戒  
從 C++11 開始,標(biāo)準(zhǔn)庫提供了 std::bind 用于綁定函數(shù) f 和調(diào)用參數(shù),返回一個新可調(diào)用函數(shù)對象 fn,下面就跟隨小編一起深入了解一下std::bind的具體使用吧

C++ 原生支持函數(shù)輸入?yún)?shù)的默認(rèn)值,但是有些業(yè)務(wù)場景下對原有設(shè)定的默認(rèn)值不滿意,那么可不可以臨時改改?

請注意,隨意改變原有代碼邏輯,并不符合軟件設(shè)計原則。有沒有什么方案或者特性可以做到不修改原有代碼邏輯,以實(shí)現(xiàn)新增參數(shù)默認(rèn)值(或者在調(diào)用時綁定特性參數(shù))的功能?

從 C++11 開始,標(biāo)準(zhǔn)庫提供了 std::bind 用于綁定函數(shù) f 和調(diào)用參數(shù),返回一個新可調(diào)用函數(shù)對象 fn (也有喊它做仿函數(shù)的)。于是,在調(diào)用函數(shù)對象 fn 和輸入新參數(shù)時,相當(dāng)于調(diào)用了原來的函數(shù) f 并自動按照綁定的關(guān)系映射參數(shù),映射的方式非常靈活。這樣被綁定映射的參數(shù),實(shí)現(xiàn)原有函數(shù) f 的參數(shù)新默認(rèn)值功能,或者減少調(diào)用函數(shù) f 時輸入的參數(shù)個數(shù)等便捷需求。

簡而言之,std::bind 被稱為轉(zhuǎn)發(fā)調(diào)用包裝器。

綁定時,通過占位符 _1, _2, _3… ,指定在調(diào)用函數(shù)對象 fn 的輸入?yún)?shù)和傳遞給函數(shù) f 的參數(shù)之間的映射位置。

被綁定的函數(shù) f 也分種類,那么,基于不同類型函數(shù)的應(yīng)用示例是怎樣的呢?

綁定靜態(tài)或者全局函數(shù)

#include <functional>

void output1(int a)
{
    printf("%d\n", a);
}

void output2(int a, int b)
{
    printf("%d %d\n", a, b);
}

int main(int argc, char * argv[])
{
    auto fn1 = std::bind(output1, std::placeholders::_1);
    fn1(1);
    auto fn2 = std::bind(output2, std::placeholders::_2, 0);
    fn2(3, 2);
    return 0;
}

output:

1
2 0

占位符代表函數(shù)對象的輸入?yún)?shù),std::placeholders::_1 對應(yīng)調(diào)用函數(shù)對象 fn 時的第 1 個輸入?yún)?shù),依次類推。

細(xì)心的你可能會留意 std::bind 返回的是可調(diào)用對象,這個和同樣從 C++11 開始引入的 Lambda 表達(dá)式概念是類似的,那么有沒有可能用 Lambda 表達(dá)式互相替換?試試改為使用 Lambda 表達(dá)式實(shí)現(xiàn)

int main(int argc, char * argv[])
{
    auto fn1 = [](int a) -> void {
        output1(a);
    };
    fn1(1);
    auto fn2 = [](int a, int b) -> void {
        output2(b, 0);
    };
    fn2(3, 2);
    return 0;
}

這樣子替換后,執(zhí)行輸出結(jié)果是一樣的。

output:

1
2 0

綁定對象成員函數(shù)

如果被綁定的函數(shù)是對象成員,需要指定所屬對象,看代碼

#include <functional>

class A
{
public:
    void output(int a, int b)
    {
        printf("%d %d\n", a, b);
    }
};

int main(int argc, char * argv[])
{
    A obj;
    auto fn = std::bind(&A::output, &obj, std::placeholders::_2, std::placeholders::_1);
    fn(5, 3);
    return 0;
}

output:

3 5

用 Lambda 表達(dá)式替換試試

int main(int argc, char * argv[])
{
    A obj;
    auto fn = [&obj](int a, int b) -> void {
        obj.output(b, a);
    };
    fn(5, 3);
    return 0;
}

output:

3 5

Notice:綁定的時候需要指定上下文環(huán)境(實(shí)例對象),這種場景已經(jīng)涉及到閉包的概念了。由于上下文環(huán)境是有生命周期的,比如上面用到的實(shí)例對象 a,如果在超出了其生命周期的情況下,引用其內(nèi)部已被釋放的資源,是會引起程序執(zhí)行異常的,這里提醒一下。

平替 Lambda

以上面兩種場景示例代碼的比較,在參數(shù)綁定的場景下,為了達(dá)到相同效果,Lambda 表達(dá)式的書寫略顯羅嗦,而 std::bind 的格式更有函數(shù)式編程的味道,可見,某些場景下推薦 std::bind 替代 Lambda 表達(dá)式。

能不能平替也分場景,三思而行。

到此這篇關(guān)于C++小利器之std::bind參數(shù)綁定包裝器的使用詳解的文章就介紹到這了,更多相關(guān)C++ std::bind內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 利用Matlab復(fù)刻舉牌加油小人生成器

    利用Matlab復(fù)刻舉牌加油小人生成器

    upuptoyou是一款非常有創(chuàng)意的小工具,可以在線生成舉牌小人,看起來很可愛,也比較有趣,并能用于表白,或節(jié)日送祝福等場景。本文將用Matlab復(fù)刻這一小工具,需要的可以參考一下
    2022-03-03
  • C語言報錯:Undefined Reference的產(chǎn)生原因和解決方案

    C語言報錯:Undefined Reference的產(chǎn)生原因和解決方案

    Undefined Reference(未定義引用)是C語言編譯過程中常見的錯誤之一,通常在鏈接階段出現(xiàn),本文將詳細(xì)介紹Undefined Reference的產(chǎn)生原因,提供多種解決方案,并通過實(shí)例代碼演示如何有效避免和解決此類錯誤,需要的朋友可以參考下
    2024-06-06
  • C語言重難點(diǎn)之內(nèi)存對齊和位段

    C語言重難點(diǎn)之內(nèi)存對齊和位段

    這篇文章主要介紹了C語言重難點(diǎn)之內(nèi)存對齊和位段,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • C++使用OpenCV進(jìn)行物體識別與檢測的三種方法

    C++使用OpenCV進(jìn)行物體識別與檢測的三種方法

    物體識別與檢測是計算機(jī)視覺中的核心任務(wù)之一,它被廣泛應(yīng)用于自動駕駛、安防監(jiān)控、圖像分析等領(lǐng)域,通過物體檢測技術(shù),計算機(jī)能夠從圖像中識別出特定的物體或目標(biāo),本文將介紹如何使用 C++ 和 OpenCV 庫進(jìn)行物體識別與檢測,需要的朋友可以參考下
    2025-04-04
  • C++中關(guān)于委派(Delegates)的實(shí)現(xiàn)示例

    C++中關(guān)于委派(Delegates)的實(shí)現(xiàn)示例

    這篇文章主要介紹了C++中關(guān)于委派(Delegates)的實(shí)現(xiàn)示例,針對C++11的一些新特性進(jìn)行講解,需要的朋友可以參考下
    2015-07-07
  • C++為什么不能修改set里的值?非要修改怎么辦?

    C++為什么不能修改set里的值?非要修改怎么辦?

    因?yàn)橹暗奈恼掠姓f過C++中 set的介紹及用法,今天這篇文章我們就來說說C++為什么不能修改set里的值,如果非要修改的話應(yīng)該怎么辦,下面我們一起進(jìn)入文章看看下面內(nèi)容,需要的朋友可以參考以下,希望對你有所幫助
    2021-11-11
  • 深入解析C++中的std::thread的使用

    深入解析C++中的std::thread的使用

    這篇文章主要介紹了C++中的std::thread的使用,在C++11新標(biāo)準(zhǔn)中,可以簡單通過使用thread庫,來管理多線程,本文通過實(shí)例代碼給大家詳細(xì)講解,需要的朋友可以參考下
    2023-04-04
  • C++使用easyX庫實(shí)現(xiàn)三星環(huán)繞效果流程詳解

    C++使用easyX庫實(shí)現(xiàn)三星環(huán)繞效果流程詳解

    EasyX是針對C/C++的圖形庫,可以幫助使用C/C++語言的程序員快速上手圖形和游戲編程。這篇文章主要介紹了C++使用easyX庫實(shí)現(xiàn)三星環(huán)繞效果,需要的可以參考一下
    2022-10-10
  • C語言中的文件操作詳解

    C語言中的文件操作詳解

    這篇文章主要介紹了C語言中的文件操作詳解,使用文件可以將數(shù)據(jù)直接存放到電腦的硬盤上,做到了數(shù)據(jù)的持久化
    2022-07-07
  • C++中異常處理的基本思想及throw語句拋出異常的使用

    C++中異常處理的基本思想及throw語句拋出異常的使用

    這篇文章主要介紹了C++中異常處理的基本思想及throw類拋出異常的使用,也深入談到了異常被拋出后的棧解旋unwinding過程,需要的朋友可以參考下
    2016-03-03

最新評論

华安县| 通山县| 秦皇岛市| 桑植县| 唐海县| 昌平区| 图们市| 中卫市| 朝阳区| 巴南区| 白水县| 巴南区| 芜湖县| 特克斯县| 海盐县| 朔州市| 丹江口市| 南京市| 济源市| 淮北市| 荃湾区| 临桂县| 崇信县| 阜宁县| 汉川市| 荥经县| 农安县| 池州市| 江永县| 商水县| 喀喇| 敦化市| 泗阳县| 黎川县| 嫩江县| 贺州市| 平原县| 武安市| 辽阳市| 宣威市| 高淳县|