午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

C++11 bind和function用法

 奔跑的瓦力 2019-03-29

參考:https://blog.csdn.net/liukang325/article/details/53668046

function是一個(gè)template,在一對尖括號(hào)中指定類型:function<int(int, int)> 表示聲明一個(gè)function類型,接受兩個(gè)int、返回一個(gè)int的可調(diào)用對象,這個(gè)返回的可調(diào)用對象可以理解為函數(shù)指針。

關(guān)于可調(diào)用對象的概念:對于一個(gè)對象或表達(dá)式,如果可以對其使用調(diào)用運(yùn)算符,則稱該對象或表達(dá)式為可調(diào)用對象。

C++語言中有幾種可調(diào)用對象:函數(shù)、函數(shù)指針、lambda表達(dá)式、bind創(chuàng)建的對象以及重載了函數(shù)調(diào)用運(yùn)算符的類。

和其他對象一樣,可調(diào)用對象也有類型。例如,每個(gè)lambda有它自己唯一的(未命名)類類型;函數(shù)及函數(shù)指針的類型則由其返回值類型和實(shí)參類型決定。

function的用法:

1. 保存普通函數(shù)

void printA(int a)
{
     cout << a << endl;          
}

std::function<void(int a)> func;
func = printA;
func(2);   //2

2. 保存lambda表達(dá)式

std::function<void()> func_1 = [](){cout << "hello world" << endl;};    
func_1();  //hello world

3. 保存成員函數(shù)

class Foo{
    Foo(int num) : num_(num){}
    void print_add(int i) const {cout << num_ + i << endl;}
    int num_;  
};

//保存成員函數(shù)
std::function<void(const Foo&,int)> f_add_display = &Foo::print_add;
Foo foo(2);
f_add_display(foo,1);

在實(shí)際使用中,可使用auto關(guān)鍵字。


 

關(guān)于bind的用法:

可將bind函數(shù)看作是一個(gè)通用的函數(shù)適配器,它接受一個(gè)可調(diào)用對象,生成一個(gè)新的可調(diào)用對象來“適應(yīng)”原對象的參數(shù)列表。

調(diào)用bind的一般形式:auto newCallable = bind(callable,arg_list);

其中,newCallable本身是一個(gè)可調(diào)用對象,arg_list是一個(gè)逗號(hào)分隔的參數(shù)列表,對應(yīng)給定的callable的參數(shù)。即,當(dāng)我們調(diào)用newCallable時(shí),newCallable會(huì)調(diào)用callable,并傳給它arg_list中的參數(shù)。

arg_list中的參數(shù)可能包含形如_n的名字,其中n是一個(gè)整數(shù),這些參數(shù)是“占位符”,表示newCallable的參數(shù),它們占據(jù)了傳遞給newCallable的參數(shù)的“位置”。數(shù)值n表示生成的可調(diào)用對象中參數(shù)的位置:_1為newCallable的第一個(gè)參數(shù),_2為第二個(gè)參數(shù),以此類推。 from 《C++ primer》

看代碼:

#include <iostream>
using namespace std;
class A
{
public:
    void fun_3(int k,int m)
    {
        cout<<k<<" "<<m<<endl;
    }
};

void fun(int x,int y,int z)
{
    cout<<x<<"  "<<y<<"  "<<z<<endl;
}

void fun_2(int &a,int &b)
{
    a++;
    b++;
    cout<<a<<"  "<<b<<endl;
}

int main(int argc, const char * argv[])
{
    //f1的類型為 function<void(int, int, int)>
    auto f1 = std::bind(fun,1,2,3); //表示綁定函數(shù) fun 的第一,二,三個(gè)參數(shù)值為: 1 2 3
    f1(); //print:1  2  3

    auto f2 = std::bind(fun, placeholders::_1,placeholders::_2,3);
    //表示綁定函數(shù) fun 的第三個(gè)參數(shù)為 3,而fun 的第一,二個(gè)參數(shù)分別由調(diào)用 f2 的第一,二個(gè)參數(shù)指定
    f2(1,2);//print:1  2  3

    auto f3 = std::bind(fun,placeholders::_2,placeholders::_1,3);
    //表示綁定函數(shù) fun 的第三個(gè)參數(shù)為 3,而fun 的第一,二個(gè)參數(shù)分別由調(diào)用 f3 的第二,一個(gè)參數(shù)指定
    //注意: f2  和  f3 的區(qū)別。
    f3(1,2);//print:2  1  3


    int n = 2;
    int m = 3;

    auto f4 = std::bind(fun_2, n,placeholders::_1); //表示綁定fun_2的第一個(gè)參數(shù)為n, fun_2的第二個(gè)參數(shù)由調(diào)用f4的第一個(gè)參數(shù)(_1)指定。
    f4(m); //print:3  4

    cout<<m<<endl;//print:4  說明:bind對于不事先綁定的參數(shù),通過std::placeholders傳遞的參數(shù)是通過引用傳遞的,如m
    cout<<n<<endl;//print:2  說明:bind對于預(yù)先綁定的函數(shù)參數(shù)是通過值傳遞的,如n


    A a;
    //f5的類型為 function<void(int, int)>
    auto f5 = std::bind(&A::fun_3, a,placeholders::_1,placeholders::_2); //使用auto關(guān)鍵字
    f5(10,20);//調(diào)用a.fun_3(10,20),print:10 20

    std::function<void(int,int)> fc = std::bind(&A::fun_3, a,std::placeholders::_1,std::placeholders::_2);
    fc(10,20);//調(diào)用a.fun_3(10,20) print:10 20 

  return 0;
}

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請遵守用戶 評(píng)論公約

    類似文章 更多