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

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

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

概述

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

可調(diào)用對象

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

std::function

std::function是一個可調(diào)用對象包裝器,是一個類模板,可以容納除了類成員函數(shù)指針之外的所有可調(diào)用對象,它可以用統(tǒng)一的方式處理函數(shù)、函數(shù)對象、函數(shù)指針,并允許保存和延遲它們的執(zhí)行。
使用std::function可以實現(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)> 表示一個返回值為 int,接受一個 float 和一個 double 類型參數(shù)的函數(shù)對象。

std::function的主要作用

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

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

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

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

  • 優(yōu)點:

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

  • 缺點:

它的使用會帶來一定的性能開銷,因為它需要在運行時進行類型檢查和動態(tài)分配內(nèi)存。
此外,如果使用不當(dāng),也容易引起內(nèi)存泄漏和對象生命周期管理的問題。

std::bind

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

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

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

std::bind的主要作用

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

例如,我們有一個函數(shù)對象:
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是一個新的可調(diào)用對象,它綁定了foo函數(shù)和參數(shù)1、2、3。我們可以像調(diào)用原始函數(shù)對象一樣調(diào)用它:
f(); // 輸出:1 2 3
我們也可以只綁定部分參數(shù):
auto g = std::bind(foo, 1, std::placeholders::_1, 3);
這里,std::placeholders::_1表示占位符,它表示在調(diào)用g時,第二個參數(shù)會被傳遞給foo函數(shù)。我們可以這樣調(diào)用g:
g(2); // 輸出:1 2 3
這就是std::bind的基本用法。它可以方便地將函數(shù)對象和參數(shù)綁定在一起,生成一個新的可調(diào)用對象。

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

優(yōu)點:

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

缺點:

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

代碼示例

#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)用對象的第幾個參數(shù),而且與原函數(shù)的該占位符所在位置的進行匹配;
  • bind綁定類成員函數(shù)時,第一個參數(shù)表示對象的成員函數(shù)的指針,第二個參數(shù)表示對象的地址,這是因為對象的成員函數(shù)需要有this指針。并且編譯器不會將對象的成員函數(shù)隱式轉(zhuǎn)換成函數(shù)指針,需要通過&手動轉(zhuǎn)換;
  • std::bind的返回值是可調(diào)用實體,可以直接賦給std::function。

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

相關(guān)文章

  • C++文件讀取的4種情況匯總

    C++文件讀取的4種情況匯總

    前幾天要用到C++讀取文本文件,就學(xué)習(xí)了一下幾種不同的讀取方法,下面這篇文章主要給大家介紹了關(guān)于C++文件讀取的4種情況,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-01-01
  • for循環(huán)中刪除map中的元素valgrind檢測提示error:Invalid read of size 8

    for循環(huán)中刪除map中的元素valgrind檢測提示error:Invalid read of size 8

    這篇文章主要介紹了for循環(huán)中刪除map中的元素valgrind檢測提示error:Invalid read of size 8 的相關(guān)資料,需要的朋友可以參考下
    2016-07-07
  • 淺談c++ 預(yù)處理器

    淺談c++ 預(yù)處理器

    這篇文章主要介紹了c++ 預(yù)處理器的的相關(guān)資料,文中示例代碼非常詳細,供大家參考和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • C/C++細數(shù)宏與函數(shù)有那些區(qū)別

    C/C++細數(shù)宏與函數(shù)有那些區(qū)別

    在C程序中,可以用宏代碼提高執(zhí)行效率。宏代碼本身不是函數(shù),但使用起來象函數(shù)。預(yù)處理器用復(fù)制宏代碼的方式代替函數(shù)調(diào)用,省去了參數(shù)壓棧、生成匯編語言的CALL調(diào)用、返回參數(shù)、執(zhí)行return等過程,從而提高了速度
    2022-10-10
  • c++與c中的數(shù)組初始化默認值如何為0

    c++與c中的數(shù)組初始化默認值如何為0

    這篇文章主要介紹了c++與c中的數(shù)組初始化默認值如何為0問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • php調(diào)用c++的方法

    php調(diào)用c++的方法

    這篇文章主要介紹了php調(diào)用c++的方法,需要的朋友可以參考下
    2014-01-01
  • 關(guān)于C語言程序的內(nèi)存分配的入門知識學(xué)習(xí)

    關(guān)于C語言程序的內(nèi)存分配的入門知識學(xué)習(xí)

    這篇文章主要介紹了關(guān)于C語言程序的內(nèi)存分配的入門知識學(xué)習(xí),特別強調(diào)了堆與棧的內(nèi)存空間申請比較,需要的朋友可以參考下
    2015-12-12
  • C語言的常量和字符串

    C語言的常量和字符串

    這篇文章主要為大家介紹了C語言常量和字符串,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • C語言 sockaddr和sockaddr_in案例詳解

    C語言 sockaddr和sockaddr_in案例詳解

    這篇文章主要介紹了C語言 sockaddr和sockaddr_in案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C++實現(xiàn)隨機數(shù)生成的現(xiàn)代化封裝

    C++實現(xiàn)隨機數(shù)生成的現(xiàn)代化封裝

    在現(xiàn)代?C++?中,隨機數(shù)生成是許多程序設(shè)計中不可或缺的部分,例如游戲開發(fā)、算法設(shè)計、統(tǒng)計模擬等,本文將以一個封裝好的隨機工具類?Random?為例,深入剖析其功能的實現(xiàn)與使用,并引入相關(guān)知識,幫助讀者觸類旁通,掌握?C++?隨機數(shù)的核心技巧
    2024-11-11

最新評論

延长县| 塔城市| 青阳县| 赞皇县| 军事| 宜宾县| 安顺市| 荣昌县| 忻州市| 安远县| 滨州市| 平塘县| 米脂县| 饶阳县| 沾化县| 本溪市| 宁明县| 太保市| 临江市| 车致| 康定县| 江山市| 漠河县| 日喀则市| 通化县| 德州市| 库伦旗| 隆德县| 西藏| 工布江达县| 江安县| 枣阳市| 南宫市| 扶余县| 望江县| 汉寿县| 扎赉特旗| 阿图什市| 丰顺县| 霸州市| 和田县|