C++11 std::bind

本文深入探讨了C++中std::bind函数的使用方法,包括其语法、参数说明及作用。通过实例展示了如何绑定普通函数、成员函数以及成员变量,并解释了bind在参数传递和延迟调用方面的特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 声明

头文件<functional>

template< class F, class... Args >
/*unspecified*/ bind( F&& f, Args&&... args );

template< class R, class F, class... Args >
/*unspecified*/ bind( F&& f, Args&&... args );

参数说明:

f:A Function object, point to function or pointer to member.(函数对象,函数指针,函数引用, 指向成员函数指针或指向成员变量指针)

args: 要绑定的参数列表,每个参数可以是a value 或者 a placeholder。

作用:

bind生成 f 的转发调用包装器。调用该包装器相当于一一些绑定的参数调用f。实现延时调用。

二 举例

#include <iostream>
#include <functional>

struct Demo
{
void print (int a, int b){
  std::cout << a << " " << b << " " << a_ << std::endl;
};
int a_ = 1;
};

int add(int& a, int& b)
{
    a++;
    b++;
    std::cout << "add " << a << " " << b << std::endl;
    return a + b;
}

int main()
{
    using namespace std::placeholders;
    {
        int a = 1;
        int b = 2;

        auto f = std::bind(add, a, _1); // 绑定普通函数, _1与调用时传入时相应位置参数对应
        a = 100;
        f(b); // output: add 2 3   说明bind时,预定参数值已经确定
    }

    {
        int a = 1;
        int b = 2;

        auto f = std::bind(add, a, _1);
        f(b);
        std::cout << " a: " << a << std::endl; // output: a: 1
        std::cout << " b: " << b << std::endl; // output: b: 3  其实还是值传递,原因是add函数参数是引用导致
    }

    Demo demo;
    auto f1 = std::bind(&Demo::print, &demo, _1, 10); // 绑定成员函数
    auto f2 = std::bind(&Demo::a_, &demo); // 绑定成员变量

    f1(20); // output: 20 10 1
    f2() = 20;
    f1(20); // output: 20 10 20
    system("pause");
    return 0;
}

三 注意

1、到 bind 的参数被复制或移动,而且决不按引用传递,除非用std::ref或者std::cref包装。

2、when invoking a pointer to non-static member function or pointer to non-static data member, the first argument has to be a reference or pointer (including, possibly, smart pointer such as std::shared_ptr and std::unique_ptr) to an object whose member will be accessed.(当绑定的是成员函数或者成员变量时,第一个参数要是实例引用或者实例指针。既可以预绑定也可以占位后,调用时传递进来)。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值