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

C++11 學(xué)習(xí)筆記之std::function和bind綁定器

 更新時(shí)間:2021年07月30日 10:00:55   作者:tycoon3  
這篇文章主要介紹了C++11 學(xué)習(xí)筆記之std::function和bind綁定器,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

std::function

      C++中的可調(diào)用對(duì)象雖然具有比較統(tǒng)一操作形式(除了類成員指針之外,都是后面加括號(hào)進(jìn)行調(diào)用),但定義方法五花八門。為了統(tǒng)一泛化函數(shù)對(duì)象,函數(shù)指針,引用函數(shù),成員函數(shù)的指針的各種操作,讓我們可以按更統(tǒng)一的方式寫出更加泛化的代碼,C++11推出了std::function。

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

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

可調(diào)用對(duì)象有如下幾種:

  • 函數(shù)指針
  • 具有operator()成員函數(shù)的類對(duì)象(仿函數(shù))
  • 可被轉(zhuǎn)換為函數(shù)指針的類對(duì)象
  • 類成員(函數(shù))指針

以上涉及的對(duì)象可以像一個(gè)函數(shù)一樣做調(diào)用操作,統(tǒng)稱為可調(diào)用對(duì)象。現(xiàn)在,C++11通過提供std::function和std::bind統(tǒng)一了可調(diào)用對(duì)象的各種操作。

1.2 可調(diào)用對(duì)象包裝器——std::function

C++中的可調(diào)用對(duì)象雖然具有比較統(tǒng)一操作形式(除了類成員指針之外,都是后面加括號(hào)進(jìn)行調(diào)用),但定義方法五花八門。為了統(tǒng)一泛化函數(shù)對(duì)象,函數(shù)指針,引用函數(shù),成員函數(shù)的指針的各種操作,讓我們可以按更統(tǒng)一的方式寫出更加泛化的代碼,C++11推出了std::function。

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

#include <iostream>
#include <functional>
 
using namespace std;
 
 void func(void){
     cout << __FUNCTION__ <<endl;
 }
 
 class Foo
 {
 public:
     static int foo_func(int a){
         cout << __FUNCTION__ << "(" << a << ") ->: ";
         return a;
     }
 };
 
 class Bar
 {
 public:
     int operator()(int a){
         cout << __FUNCTION__ << "(" << a << ") ->: ";
         return a;
     }
 };
 
 int main(){
     //綁定一個(gè)普通函數(shù)
     std::function<void(void)> fry = func;
     fry();
 
     
     //綁定一個(gè)類的靜態(tài)成員函數(shù)
     std::function<int(int)> fr2 = Foo::foo_func;
     cout << fr2(123) << endl;
     
     //綁定一個(gè)仿函數(shù)
     Bar bar;
     fr2 = bar;
     cout << fr2(123) <<endl;
 
     return 0;
 }
root@ubuntu:~/c++# g++ -std=c++11 func1.cpp -o func
root@ubuntu:~/c++# ./func 
func
foo_func(123) ->: 123
operator()(123) ->: 123
root@ubuntu:~/c++#

std::function的使用方法:我們給std::function填入合適的函數(shù)簽名(即一個(gè)函數(shù)類型,只需要包括返回值和參數(shù)表)之后,它就變成了一個(gè)可以容納所有這一類調(diào)用方式的“函數(shù)包裝器”。

#include <iostream>
#include <functional>
 
using namespace std;
 
 class A
 {
 public:
     A(const std::function<void()>& f) :callback_(f){}
     
     void notify(void){
         callback_();
     }
 private:
     std::function<void()> callback_;
 };
 
 class Foo
 {
 public:
     void operator()(void){
         cout <<"in " <<  __FUNCTION__<< endl;
     }
 };
 
 int main(){
     Foo foo;
     A aa(foo);
     aa.notify();
     
     return 0;
 }
"func2.cpp" 32L, 452C written                                              
root@ubuntu:~/c++# g++ -std=c++11 func2.cpp -o func
root@ubuntu:~/c++# ./func
in operator()

C++11 std::function 是一種通用、多態(tài)的函數(shù)封裝,它的實(shí)例可以對(duì)任何可以調(diào)用的目標(biāo)實(shí)體進(jìn)行存儲(chǔ)、復(fù)制和調(diào)用操作,它也是對(duì) C++中現(xiàn)有的可調(diào)用實(shí)體的一種類型安全的包裹(相對(duì)來說,函數(shù)指針的調(diào)用不是類型安全的),換句話說,就是函數(shù)的容器。當(dāng)我們有了函數(shù)的容器之后便能夠更加方便的將函數(shù)、函數(shù)指針作為對(duì)象進(jìn)行處理。例如:lambda函數(shù)

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

相關(guān)文章

  • C語言大小端字節(jié)序存儲(chǔ)模式深入解讀

    C語言大小端字節(jié)序存儲(chǔ)模式深入解讀

    我們知道,當(dāng)編譯器執(zhí)行 “創(chuàng)建變量” 這一代碼時(shí),會(huì)在內(nèi)存中開辟空間相應(yīng)的空間來存儲(chǔ)變量值。而對(duì)于整型變量而言,變量值又是以二進(jìn)制補(bǔ)碼的形式存放的
    2022-09-09
  • 淺談時(shí)間戳與日期時(shí)間互轉(zhuǎn)C語言

    淺談時(shí)間戳與日期時(shí)間互轉(zhuǎn)C語言

    下面小編就為大家?guī)硪黄獪\談時(shí)間戳與日期時(shí)間互轉(zhuǎn)C語言。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-06-06
  • Matlab利用垂距法實(shí)現(xiàn)提取離散坐標(biāo)數(shù)據(jù)特征點(diǎn)

    Matlab利用垂距法實(shí)現(xiàn)提取離散坐標(biāo)數(shù)據(jù)特征點(diǎn)

    垂距法是指根據(jù)中間頂點(diǎn)到其前、后兩相鄰頂點(diǎn)連線的距離的大小,來確定是否保留該頂點(diǎn)的一種線要素頂點(diǎn)壓縮算法。本文將利用這一算法實(shí)現(xiàn)提取離散坐標(biāo)數(shù)據(jù)特征點(diǎn),需要的可以參考下
    2022-04-04
  • c++ 實(shí)現(xiàn)文件逐行讀取與字符匹配

    c++ 實(shí)現(xiàn)文件逐行讀取與字符匹配

    這里嘗試通過C++來實(shí)現(xiàn)一個(gè)文件IO的功能,看看是否能夠比python的表現(xiàn)更好一些,感興趣的朋友可以參考下
    2021-05-05
  • Opencv分水嶺算法學(xué)習(xí)

    Opencv分水嶺算法學(xué)習(xí)

    這篇文章主要為大家詳細(xì)介紹了Opencv分水嶺算法的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C語言代碼實(shí)現(xiàn)簡(jiǎn)易三子棋游戲

    C語言代碼實(shí)現(xiàn)簡(jiǎn)易三子棋游戲

    這篇文章主要為大家詳細(xì)介紹了C語言代碼實(shí)現(xiàn)簡(jiǎn)易三子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • 利用C語言實(shí)現(xiàn)“百馬百擔(dān)”問題方法示例

    利用C語言實(shí)現(xiàn)“百馬百擔(dān)”問題方法示例

    百馬百擔(dān)是道經(jīng)典的算法題,下面這篇文章主要給大家介紹了利用C語言實(shí)現(xiàn)“百馬百擔(dān)”問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12
  • C++面向?qū)ο髮?shí)現(xiàn)萬年歷的示例代碼

    C++面向?qū)ο髮?shí)現(xiàn)萬年歷的示例代碼

    本文將通過面向?qū)ο髮?shí)現(xiàn)一個(gè)簡(jiǎn)單的日歷(萬年歷)效果,主要會(huì)有以下幾個(gè)模塊:模型、視圖、控制,感興趣的小伙伴可以動(dòng)手嘗試一下
    2022-06-06
  • C/C++詳解實(shí)現(xiàn)二層轉(zhuǎn)發(fā)

    C/C++詳解實(shí)現(xiàn)二層轉(zhuǎn)發(fā)

    數(shù)據(jù)鏈路層是開放系統(tǒng)互連 (OSI) 模型中的第二層,該層用于通過 LAN 等單一網(wǎng)絡(luò)進(jìn)行通信的節(jié)點(diǎn),第二層數(shù)據(jù)包不能從一個(gè)網(wǎng)絡(luò)傳輸?shù)搅硪粋€(gè)網(wǎng)絡(luò)。而二層轉(zhuǎn)發(fā)是根據(jù)報(bào)文的目的MAC直接進(jìn)行轉(zhuǎn)發(fā),轉(zhuǎn)發(fā)過程中不用對(duì)報(bào)文的頭部做任何的修改
    2022-05-05
  • c語言文件讀寫示例(c語言文件操作)

    c語言文件讀寫示例(c語言文件操作)

    這篇文章主要介紹了c語言文件讀寫示例(c語言文件操作),需要的朋友可以參考下
    2014-02-02

最新評(píng)論