溫馨提示×

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

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

C++ stl庫(kù)bind函數(shù)模板用法的注意事項(xiàng)

發(fā)布時(shí)間:2020-07-16 20:16:51 來(lái)源:網(wǎng)絡(luò) 閱讀:1451 作者:zmh009_NAME 欄目:編程語(yǔ)言

類成員函數(shù)

bind可以包裝類成員函數(shù),創(chuàng)建函數(shù)對(duì)象。其中有接收類類型和類指針類型的版本,如:

#include <iostream>
#include <memory>
#include <functional>
using namespace std;

struct TesSt {
    TesSt()
    {}

    void update(const string &in_str) {
        str = in_str;
        cout << "str:" << str << endl;;
    }

    string str;
};

TesSt g_test_st;

int main () {
    auto func1 = bind(&TesSt::update, &g_test_st, "hihi"); 
    auto func2 = bind(TesSt::update, &g_test_st, "hihi");
    auto func3 = bind(&TesSt::update, g_test_st, "hihi");
    auto func4 = bind(TesSt::update, g_test_st, "hihi");
    return 0;
}

如果不做任何處理的話,bind函數(shù)是通過(guò)值拷貝的方式進(jìn)行參數(shù)傳遞。也就是說(shuō),func1、func2是經(jīng)過(guò)被拷貝的類指針構(gòu)造,調(diào)用會(huì)更新g_test_st內(nèi)容;func3、func4是值拷貝構(gòu)造,調(diào)用時(shí)更新的是g_test_st的副本,不會(huì)影響原來(lái)的類變量。

另外,可以通過(guò)std::ref,使bind進(jìn)行引用傳遞參數(shù),如:

    auto func3 = bind(&TesSt::update, std::ref(g_test_st), "hihi");

這樣func3調(diào)用時(shí)更新的是g_test_st的引用內(nèi)容,并不是副本。

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

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

AI