溫馨提示×

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

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

C++ bind函數(shù)適配器

發(fā)布時(shí)間:2020-08-11 08:23:10 來源:網(wǎng)絡(luò) 閱讀:860 作者:zmh009_NAME 欄目:編程語言

    在我之前的博客讓類成員函數(shù)指針成為可調(diào)用對(duì)象里有提到bind函數(shù)適配器,現(xiàn)在在這里介紹一下。

    適配器可以讓某一個(gè)看上去像另一個(gè)行為,比如棧、隊(duì)列等,底層使用鏈表去完成功能,我們通過操作底層鏈表去實(shí)現(xiàn)棧、隊(duì)列等的行為。bind是函數(shù)適配器,通過bind返回的可調(diào)用對(duì)象去完成指定函數(shù)的功能。

    bind的頭文件是<functional>,可使用命名空間std::placeholders的_n形式引用外部參數(shù),屬于C++11標(biāo)準(zhǔn)。

    使用例子:

// main.cpp
#include <functional>
#include <iostream>
using namespace std::placeholders;
using std::less;
using std::cout;
using std::endl;

int main()
{
    // less<int>是函數(shù)類模板,less<int>()返回一個(gè)臨時(shí)值,可作為可調(diào)用對(duì)象,通過重載調(diào)用運(yùn)算符調(diào)用
    auto f = bind(less<int>(),2,_1); // bind里2為可調(diào)用對(duì)象的第一個(gè)參數(shù),_1為可調(diào)用對(duì)象的第二個(gè)參數(shù),以此類推
    cout << f(3) << endl; // 此處3對(duì)應(yīng)bind里的_1,等價(jià)于less<int>()(2,3),即2與3比較大小
    return 0;
}

    _1、_2、...、_29等為命名空間std::placeholders的成員(在頭文件里從_1到_29,可使用29種參數(shù),在平常的編程里已經(jīng)足夠了,可通過std::placeholders::_n使用),可以接收外部的實(shí)參作為指定可調(diào)用對(duì)象的某個(gè)參數(shù),bind里第二個(gè)開始的參數(shù)順序?yàn)榭烧{(diào)用對(duì)象的參數(shù)順序,_n形式為外部的實(shí)參,通過bind返回的可調(diào)用對(duì)象傳入:

    如:auto fnt = bind(function,_2,2,"3",_2,_1);里(看上去有些復(fù)雜),等價(jià)于function(_2,2,"3",_2,_1);調(diào)用,而_1、_2需要bind返回的fnt接收,如果有fnt(x,y);則等價(jià)于function(y,2,"3",y,x);此時(shí)_1為x,_2為y。

    bind的使用環(huán)境,如傳入可調(diào)用對(duì)象的參數(shù)過多時(shí),可以通過bind指定一個(gè)或幾個(gè)已知的參數(shù),然后其他的參數(shù)在使用時(shí)指定,如果使用less<T>時(shí),如果使用時(shí)需要?jiǎng)討B(tài)傳入一個(gè)參數(shù),在使用前已知需要比較的是數(shù)字num,則使用auto fnt = bind(less<int>(),num,_1);,通過fnt接收外部的參數(shù)以完成功能。

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

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

AI