欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++11 std::function和std::bind 的使用示例詳解

 更新時(shí)間:2023年03月18日 09:02:55   作者:泡沫o0  
C++11中的std::function和std::bind是函數(shù)對(duì)象的重要組成部分,它們可以用于將函數(shù)和參數(shù)綁定在一起,形成一個(gè)可調(diào)用的對(duì)象,這篇文章主要介紹了C++11 std::function和std::bind 的使用示例詳解,需要的朋友可以參考下

概述

C++11中的std::functionstd::bind是函數(shù)對(duì)象的重要組成部分,它們可以用于將函數(shù)和參數(shù)綁定在一起,形成一個(gè)可調(diào)用的對(duì)象。
std::function可以存儲(chǔ)任意可調(diào)用對(duì)象,包括函數(shù)指針、函數(shù)對(duì)象、lambda表達(dá)式等,而std::bind則可以將函數(shù)和參數(shù)綁定在一起,形成一個(gè)新的可調(diào)用對(duì)象。它們的使用可以大大簡(jiǎn)化代碼,提高代碼的可讀性和可維護(hù)性。

可調(diào)用對(duì)象

C++中有如下幾種可調(diào)用對(duì)象,函數(shù)、函數(shù)指針、lambda表達(dá)式、bind對(duì)象、函數(shù)對(duì)象。
其中,lambda表達(dá)式和bind對(duì)象是C++11標(biāo)準(zhǔn)中提出的(bind機(jī)制并不是新標(biāo)準(zhǔn)中首次提出,而是對(duì)舊版本中bind1st和bind2st的合并)。

std::function

std::function是一個(gè)可調(diào)用對(duì)象包裝器,是一個(gè)類模板,可以容納除了類成員函數(shù)指針之外的所有可調(diào)用對(duì)象,它可以用統(tǒng)一的方式處理函數(shù)、函數(shù)對(duì)象、函數(shù)指針,并允許保存和延遲它們的執(zhí)行。
使用std::function可以實(shí)現(xiàn)回調(diào)函數(shù)、事件處理等功能。

std::function函數(shù)原型

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

std::function的主要作用

  • 對(duì)C++中各種可調(diào)用實(shí)體(普通函數(shù)、Lambda表達(dá)式、函數(shù)指針、以及其它函數(shù)對(duì)象等)的封裝,形成一個(gè)新的可調(diào)用的std::function對(duì)象,簡(jiǎn)化調(diào)用;
  • 對(duì)C++中現(xiàn)有的可調(diào)用實(shí)體的一種類型安全的包裹(如:函數(shù)指針這類可調(diào)用實(shí)體,是類型不安全的)。
  • 將函數(shù)作為參數(shù)傳遞給其他函數(shù);
  • 將函數(shù)作為返回值返回;
  • 將函數(shù)對(duì)象作為參數(shù)傳遞給其他函數(shù);
  • 將函數(shù)對(duì)象作為返回值返回。
//例如,定義一個(gè)返回值為int,參數(shù)為兩個(gè)int的函數(shù)對(duì)象: 
std::function<int(int, int)>func; 

//可以將一個(gè)函數(shù)指針或lambda表達(dá)式賦值給函數(shù)對(duì)象: 
int add(int a, int b) { return a +b; } 
func = add; // 函數(shù)指針賦值 
func = [](int a, int b) { return a + b; };// lambda表達(dá)式賦值 

//調(diào)用函數(shù)對(duì)象可以使用operator(),例如:
int result = func(1, 2); // 調(diào)用add函數(shù),返回3

std::function的優(yōu)缺點(diǎn)

  • 優(yōu)點(diǎn):

可以方便地實(shí)現(xiàn)回調(diào)函數(shù)、事件處理等功能,同時(shí)也可以用于實(shí)現(xiàn)函數(shù)對(duì)象的封裝和傳遞。

  • 缺點(diǎn):

它的使用會(huì)帶來一定的性能開銷,因?yàn)樗枰谶\(yùn)行時(shí)進(jìn)行類型檢查和動(dòng)態(tài)分配內(nèi)存。
此外,如果使用不當(dāng),也容易引起內(nèi)存泄漏和對(duì)象生命周期管理的問題。

std::bind

std::function是一個(gè)可調(diào)用對(duì)象包裝器,是一個(gè)類模板,可以容納除了類成員函數(shù)指針之外的所有可調(diào)用對(duì)象,它可以用統(tǒng)一的方式處理函數(shù)、函數(shù)對(duì)象、函數(shù)指針,并允許保存和延遲它們的執(zhí)行。

std::bind函數(shù)原型

template<class F, class... Args> 
/unspecified/ bind(F&& f, Args&&... args);
//其中,F(xiàn)是要綁定的函數(shù)對(duì)象,Args是要綁定的參數(shù)。返回值是一個(gè)新的可調(diào)用對(duì)象,可以直接調(diào)用或者存儲(chǔ)起來后再調(diào)用。

std::bind的主要作用

  • 將可調(diào)用對(duì)象和其參數(shù)綁定成一個(gè)仿函數(shù);
  • 只綁定部分參數(shù),減少可調(diào)用對(duì)象傳入的參數(shù)。
  • 綁定函數(shù)對(duì)象的參數(shù),生成一個(gè)新的可調(diào)用對(duì)象,可以方便地將函數(shù)對(duì)象作為參數(shù)傳遞給其它函數(shù)。
  • 可以將成員函數(shù)綁定到對(duì)象上,生成一個(gè)新的可調(diào)用對(duì)象,方便地調(diào)用成員函數(shù)。
  • 可以將成員函數(shù)綁定到對(duì)象指針上,生成一個(gè)新的可調(diào)用對(duì)象,方便地調(diào)用成員函數(shù)。
  • 可以將成員函數(shù)綁定到對(duì)象引用上,生成一個(gè)新的可調(diào)用對(duì)象,方便地調(diào)用成員函數(shù)。
  • 可以將函數(shù)對(duì)象綁定到函數(shù)指針上,生成一個(gè)新的可調(diào)用對(duì)象,方便地調(diào)用函數(shù)對(duì)象。
  • 可以將函數(shù)對(duì)象綁定到函數(shù)引用上,生成一個(gè)新的可調(diào)用對(duì)象,方便地調(diào)用函數(shù)對(duì)象。
  • 可以將函數(shù)對(duì)象綁定到std::function對(duì)象上,生成一個(gè)新的可調(diào)用對(duì)象,方便地調(diào)用函數(shù)對(duì)象。

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

std::bind的優(yōu)缺點(diǎn)

優(yōu)點(diǎn):

可以方便地實(shí)現(xiàn)函數(shù)對(duì)象的復(fù)用和參數(shù)的延遲綁定,從而提高代碼的可讀性和可維護(hù)性。

缺點(diǎn):

可能會(huì)導(dǎo)致代碼的復(fù)雜性增加,特別是當(dāng)參數(shù)較多時(shí),需要謹(jǐn)慎使用。

代碼示例

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

總結(jié)

  • 預(yù)綁定的參數(shù)是以值傳遞的形式,不預(yù)綁定的參數(shù)要用std::placeholders(占位符)的形式占位,從_1開始,依次遞增,是以引用傳遞的形式;
  • std::placeholders表示新的可調(diào)用對(duì)象的第幾個(gè)參數(shù),而且與原函數(shù)的該占位符所在位置的進(jìn)行匹配;
  • bind綁定類成員函數(shù)時(shí),第一個(gè)參數(shù)表示對(duì)象的成員函數(shù)的指針,第二個(gè)參數(shù)表示對(duì)象的地址,這是因?yàn)閷?duì)象的成員函數(shù)需要有this指針。并且編譯器不會(huì)將對(duì)象的成員函數(shù)隱式轉(zhuǎn)換成函數(shù)指針,需要通過&手動(dòng)轉(zhuǎn)換;
  • std::bind的返回值是可調(diào)用實(shí)體,可以直接賦給std::function。

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

相關(guān)文章

  • C++ 學(xué)習(xí)之旅 Windows程序內(nèi)部運(yùn)行原理

    C++ 學(xué)習(xí)之旅 Windows程序內(nèi)部運(yùn)行原理

    學(xué)習(xí)C++與.net不同的是,一定要搞清楚Windows程序內(nèi)部運(yùn)行原理,因?yàn)樗婕按蠖鄶?shù)是操作系統(tǒng)的調(diào)用,而.net畢竟是在.netFrameWork上唱戲
    2012-11-11
  • C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之堆排序詳解

    C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之堆排序詳解

    堆是計(jì)算機(jī)科學(xué)中一類特殊的數(shù)據(jù)結(jié)構(gòu)的統(tǒng)稱,通常是一個(gè)可以被看做一棵完全二叉樹的數(shù)組對(duì)象。而堆排序是利用堆這種數(shù)據(jù)結(jié)構(gòu)所設(shè)計(jì)的一種排序算法。本文將通過圖片詳細(xì)介紹堆排序,需要的可以參考一下
    2022-03-03
  • C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之二叉鏈表創(chuàng)建二叉樹

    C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之二叉鏈表創(chuàng)建二叉樹

    這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之?二叉鏈表創(chuàng)建二叉樹,下文我們?yōu)榱烁奖愕氖褂枚鏄浣Y(jié)構(gòu)體,可以使用?typedef?對(duì)結(jié)構(gòu)體進(jìn)行命名,具體內(nèi)容需要的小伙伴可以參考一下
    2022-02-02
  • kernel劫持modprobe?path內(nèi)容詳解

    kernel劫持modprobe?path內(nèi)容詳解

    這篇文章主要為大家介紹了kernel劫持modprobe?path的內(nèi)容詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • C C++ LeetCode題解在二叉樹中增加一行示例詳解

    C C++ LeetCode題解在二叉樹中增加一行示例詳解

    這篇文章主要為大家介紹了C C++ LeetCode題解在二叉樹中增加一行示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • C語(yǔ)言之free函數(shù)以及野指針介紹

    C語(yǔ)言之free函數(shù)以及野指針介紹

    以下是對(duì)C語(yǔ)言中的free函數(shù)與野指針進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以參考下
    2013-07-07
  • C語(yǔ)言實(shí)現(xiàn)文件讀寫操作的幾種常用方法

    C語(yǔ)言實(shí)現(xiàn)文件讀寫操作的幾種常用方法

    C語(yǔ)言提供了一系列文件操作函數(shù),使得我們可以通過程序?qū)ξ募M(jìn)行讀寫操作,本文主要介紹了C語(yǔ)言實(shí)現(xiàn)文件讀寫操作的幾種常用方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • C語(yǔ)言?棧與數(shù)組的實(shí)現(xiàn)詳解

    C語(yǔ)言?棧與數(shù)組的實(shí)現(xiàn)詳解

    棧(stack)又名堆棧,它是一種運(yùn)算受限的線性表。限定僅在表尾進(jìn)行插入和刪除操作的線性表。這一端被稱為棧頂,相對(duì)地,把另一端稱為棧底。向一個(gè)棧插入新元素又稱作進(jìn)棧、入?;驂簵?,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素
    2022-04-04
  • 如何用C寫一個(gè)web服務(wù)器之CGI協(xié)議

    如何用C寫一個(gè)web服務(wù)器之CGI協(xié)議

    本文主要介紹了如何用C寫一個(gè)web服務(wù)器之CGI協(xié)議,對(duì)C語(yǔ)言和web感興趣的同學(xué),可以詳細(xì)看下,并且試驗(yàn)一下。
    2021-05-05
  • C語(yǔ)言超市管理系統(tǒng)設(shè)計(jì)

    C語(yǔ)言超市管理系統(tǒng)設(shè)計(jì)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言超市管理系統(tǒng)設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02

最新評(píng)論