c++11 - std::function 和 std::bind

默认分类 · 2024-04-18 · 52 人浏览

std::function

简单而言就是一个函数包装器,一个通用函数类型
头文件 #include <functional>
用法:function<int(int, int)> 里面传入的是返回值 和参数列表

示例

#include <iostream>
#include <functional>
using namespace std;

void vfun() {

    cout << "void fun()" << endl;
}

int ifun(int a) {

    cout << "int fun(int a)" << endl;
    return 0;
}

int main() {
    // Your code here


    function<void()> _vf = vfun; // 接收函数指针
    function<int(int)> _if = ifun;
    

    function<int()> _lf = []() {
        cout << "lambda fun()" << endl;
        return 1;
    }; //接收 lambda 表达式

    _vf();  // void fun()
    _if(1); // int fun(int a)
    _lf(); // lambda fun()
    return 0;
}

std::bind

头文件
#include <functional>
定义
先来看一下定义,这是在 cppreference 中对它的描述

The function template std::bind generates a forwarding call wrapper for f. Calling this wrapper is equivalent to invoking f with some of its arguments bound to args.

函数模板 std::bind 为f生成一个转发调用包装器。调用这个包装器相当于调用f,它的一些参数绑定到args。

它的模板形式是这么定义的
template< class F, class... Args >
用法
接下来我们来看看用法

调用bind的一般形式
auto newCallable = bind(callable, arg_list);
绑定普通函数
假如我们现在有这样一个函数

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

然后我们可以使用 std::bind 进行一个绑定

auto f1 = std::bind(fun, 1, 2, 3);
f1();

我们通过bind将 1, 2, 3 绑定到了 fun 的三个参数上,接下来使用f1(); 就相当于 调用了 fun(1, 2, 3);
再看一种情况

auto f2 = std::bind(fun, 1, std::placeholders::_1, std::placeholders::_2);
f2(2, 3);

这样表示我们表示绑定函数 fun 的第以个参数为1, 剩下两个由我们调用 f2 时的第一个和第二个参数决定

绑定类成员函数
因为类成员函数有一个隐含的参数 -> this 指针, 所以我们在绑定类成员函数时要先绑定 一个对象地址进去
示例
有这样一个类成员函数

struct Demo{
    void fun(int x, int y, int z) {
        std::cout << "print: x = " << x << ", y = " << y << ", z = " << z << std::endl;
    }
};

应该这样绑定

Demo a;
auto f3 = std::bind(&Demo::fun, &a /*绑定 this 指针进去*/, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
f3(1, 2, 3);

注意,上面我都是用auto 接收的 bind 返回值,实际上可以用 function 接收

c++ 语法 c++11
Theme Jasmine by Kent Liao