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

C++中的bind實(shí)踐代碼

 更新時(shí)間:2025年12月11日 09:20:38   作者:碼上睡覺  
std::bind是C++中的一個(gè)函數(shù)適配器,用于預(yù)先固定函數(shù)的某些參數(shù),生成一個(gè)新的函數(shù)對(duì)象,它通過占位符來實(shí)現(xiàn)參數(shù)的占位和重排,本文介紹C++中的bind代碼實(shí)踐,感興趣的朋友跟隨小編一起看看吧

1.std::bind是什么?

簡(jiǎn)單來說,std::bind 是一個(gè)函數(shù)適配器(Adapter)。

核心作用是“預(yù)先固定”一個(gè)函數(shù)的某些參數(shù),從而生成一個(gè)新的函數(shù)對(duì)象。

你可以把它想象成一個(gè)模具:原來的函數(shù)需要 3 個(gè)原料,你先塞進(jìn)去 1 個(gè)固定的原料,剩下的 2 個(gè)留空(占位),這就變成了一個(gè)只需要 2 個(gè)原料的新工具。

2. 核心機(jī)制:占位符 (std::placeholders)

要使用 std::bind,必須先認(rèn)識(shí)它的搭檔:占位符。

它們位于 std::placeholders 命名空間下,通常寫成 _1, _2, _3...

  • _1:代表新函數(shù)被調(diào)用時(shí)的第 1 個(gè)參數(shù)。
  • _2:代表新函數(shù)被調(diào)用時(shí)的第 2 個(gè)參數(shù)。
  • 以此類推。

3. 代碼實(shí)戰(zhàn)

我們需要包含頭文件:

#include <functional>
using namespace std::placeholders; // 方便使用 _1, _2

場(chǎng)景 A:固定參數(shù)(減少參數(shù)個(gè)數(shù))

假設(shè)你有一個(gè)減法函數(shù),你希望得到一個(gè)“減去 10”的專用函數(shù)。

#include <iostream>
#include <functional>
using namespace std::placeholders;
int sub(int a, int b) {
    return a - b;
}
int main() {
    // 使用 bind:
    // 我們把 sub 的第二個(gè)參數(shù) b 固定死為 10
    // _1 代表新函數(shù) sub_ten 的第一個(gè)參數(shù),它會(huì)被填入 sub 的第一個(gè)位置 a
    auto sub_ten = std::bind(sub, _1, 10);
    // 調(diào)用新函數(shù):
    // 實(shí)際執(zhí)行的是: sub(20, 10)
    std::cout << sub_ten(20) << std::endl; // 輸出 10
    return 0;
}

場(chǎng)景 B:參數(shù)重排(改變參數(shù)順序)

std::bind 甚至可以顛倒參數(shù)的順序。

// 還是上面的 sub(a, b) -> a - b
// 這次我們交換位置:
// sub 的第一個(gè)參數(shù) (a) 吃新函數(shù)的第二個(gè)參數(shù) (_2)
// sub 的第二個(gè)參數(shù) (b) 吃新函數(shù)的第一個(gè)參數(shù) (_1)
auto reverse_sub = std::bind(sub, _2, _1);
// 調(diào)用: reverse_sub(10, 20)
// 實(shí)際執(zhí)行: sub(20, 10) -> 20 - 10
std::cout << reverse_sub(10, 20) << std::endl; // 輸出 10

場(chǎng)景 C:綁定成員函數(shù)(最常用的舊式寫法)

這是 std::bind 在 C++11 初期最常見的用途:配合 std::function 做回調(diào),特別是為了綁定 this 指針。

class Hero {
public:
void heal(int amount) {
    std::cout << "Healed " << amount << " hp." << std::endl;
}
};
int main() {
    Hero myHero;
    // 綁定成員函數(shù)
    // 參數(shù)1:成員函數(shù)指針 &Hero::heal
    // 參數(shù)2:對(duì)象實(shí)例的地址 &myHero (作為隱式的 this)
    // 參數(shù)3:占位符 _1 (將來傳進(jìn)來的 amount)
    std::function<void(int)> func = std::bind(&Hero::heal, &myHero, _1);
    func(50); // 輸出: Healed 50 hp.
}

4. 這里的坑:參數(shù)拷貝 vs 引用

這是 std::bind 最容易出錯(cuò)的地方。std::bind 默認(rèn)是按值拷貝參數(shù)的!

如果你想綁定的參數(shù)是一個(gè)引用,或者是一個(gè)無法拷貝的對(duì)象

(比如 unique_ptr),你必須顯式使用 std::refstd::cref (const ref)。

void updateScore(int& score, int val) {
    score += val;
}
int main() {
    int myScore = 100;
    // 錯(cuò)誤寫法!
    // auto update = std::bind(updateScore, myScore, _1); 
    // 這會(huì)導(dǎo)致 bind 內(nèi)部拷貝了一份 myScore,原本的 myScore 不會(huì)變。
    // 正確寫法:使用 std::ref
    auto update = std::bind(updateScore, std::ref(myScore), _1);
    update(20); 
    std::cout << myScore << std::endl; // 輸出 120
}

5. 靈魂拷問:為什么現(xiàn)在不推薦用std::bind?

既然 Lambda 講完了,Bind 也講完了,我們對(duì)比一下。現(xiàn)在 C++ 社區(qū)(包括官方指南)強(qiáng)烈建議能用 Lambda 就別用 Bind。

原因如下:

  1. 可讀性差bind(func, _2, 10, _1) 這種寫法像是猜謎語,你需要腦補(bǔ)參數(shù)填空的對(duì)應(yīng)關(guān)系。而 Lambda [](int x, int y) { return func(y, 10, x); } 一目了然。
  2. 容易出錯(cuò):剛才提到的 std::ref 問題,很容易忘記寫,導(dǎo)致很多隱晦的 Bug。而 Lambda 的捕獲列表 [&] 顯式且直觀。
  3. 編譯器優(yōu)化:Lambda 表達(dá)式對(duì)編譯器來說是透明的代碼塊,容易內(nèi)聯(lián)優(yōu)化。std::bind 生成的是復(fù)雜的模板對(duì)象,編譯器優(yōu)化起來比較費(fèi)勁,有時(shí)會(huì)導(dǎo)致生成的二進(jìn)制代碼更大、更慢。

對(duì)比示例:

// 任務(wù):調(diào)用 object.process(data)
// 方式 1: std::bind (舊時(shí)代)
auto task1 = std::bind(&MyClass::process, &object, data);
// 方式 2: Lambda (新時(shí)代 - 推薦)
auto task2 = [&object, data]() { object.process(data); };

到此這篇關(guān)于C++中的bind代碼實(shí)踐的文章就介紹到這了,更多相關(guān)C++ bind內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 帶你了解C++中的sort函數(shù)

    帶你了解C++中的sort函數(shù)

    這篇文章主要給大家介紹了關(guān)于C++中sort函數(shù)的基礎(chǔ)入門使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧
    2021-08-08
  • C語言頭文件<string.h>函數(shù)詳解

    C語言頭文件<string.h>函數(shù)詳解

    本文主要介紹了C語言頭文件<string.h>函數(shù)詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • C++ primer超詳細(xì)講解順序容器

    C++ primer超詳細(xì)講解順序容器

    本文主要介紹了C++順序容器(vector、deque、list)的使用詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • 簡(jiǎn)單的漢諾塔問題解法代碼

    簡(jiǎn)單的漢諾塔問題解法代碼

    漢諾塔本是C語言開門就學(xué)的東西,簡(jiǎn)單的漢諾塔問題解法代碼
    2013-03-03
  • C++ min/max_element 函數(shù)用法詳解

    C++ min/max_element 函數(shù)用法詳解

    這篇文章主要介紹了C++ min/max_element 函數(shù)用法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • C/C++中使用列表框組件Qt?ListWidget

    C/C++中使用列表框組件Qt?ListWidget

    本文詳細(xì)講解了C/C++中使用列表框組件Qt?ListWidget的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-11-11
  • C++ 關(guān)于MFC List Control 控件的總結(jié)

    C++ 關(guān)于MFC List Control 控件的總結(jié)

    這篇文章主要介紹了C++ 關(guān)于MFC List Control 控件的總結(jié)的相關(guān)資料,十分的詳細(xì),有需要的朋友可以參考下
    2015-06-06
  • C++中的模板類&模板函數(shù)

    C++中的模板類&模板函數(shù)

    這篇文章主要介紹了C++中的模板類&模板函數(shù)用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C++中不能被重載的運(yùn)算符介紹

    C++中不能被重載的運(yùn)算符介紹

    其實(shí)在C/C++ 里大多數(shù)運(yùn)算符都可以在C++中被重載的。C 的運(yùn)算符中只有 . 和 ?:(以及 sizeof,技術(shù)上可以看作一個(gè)運(yùn)算符)不可以被重載
    2013-10-10
  • C語言的可變參數(shù)函數(shù)實(shí)現(xiàn)詳解

    C語言的可變參數(shù)函數(shù)實(shí)現(xiàn)詳解

    某些情況下我們希望函數(shù)的參數(shù)個(gè)數(shù)可以根據(jù)需要確定,因此c語言引入可變參數(shù)函數(shù)。典型的可變參數(shù)函數(shù)的例子有printf()、scanf()等,下面我就開始講解
    2021-08-08

最新評(píng)論

博白县| 中山市| 迭部县| 蒙城县| 吉隆县| 肃北| 东乡| 从江县| 扶绥县| 高安市| 无棣县| 抚松县| 星座| 剑川县| 京山县| 开化县| 肥西县| 岳西县| 科尔| 若尔盖县| 绥宁县| 克什克腾旗| 浏阳市| 辽宁省| 高要市| 红桥区| 贵定县| 永年县| 衡阳市| 石河子市| 彭山县| 峨山| 云梦县| 凤庆县| 郎溪县| 饶平县| 安顺市| 新源县| 融水| 海城市| 海宁市|