前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >std::function与std::bind

std::function与std::bind

作者头像
灰子学技术
发布于 2022-01-18 06:08:22
发布于 2022-01-18 06:08:22
94100
代码可运行
举报
文章被收录于专栏:灰子学技术灰子学技术
运行总次数:0
代码可运行

一、背景介绍: 函数指针始终不太灵活,它只能指向全局或静态函数,对于类成员函数、lambda表达式或其他可调用对象就无能为力了,因此,C++11推出了std::function与std::bind这两件大杀器,他们配合起来能够很好的替代函数指针。

二、内容介绍:

bind提供两类比较重要的功能:

一个是:可以自定义参数的位置,补充进来需要函数里面缺少的参数(备注:这里主要针对Class里面的成员函数里面的默认参数this)

1. bind里面的参数顺序代码示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <random>
#include <iostream>
#include <memory>
#include <functional>
 
void f(int n1, int n2, int n3, const int& n4, int n5)
{
    std::cout << n1 << ' ' << n2 << ' ' << n3 << ' ' << n4 << ' ' << n5 << '\n';
}
 
int main()
{
    using namespace std::placeholders;  // for _1, _2, _3...
    std::cout << "1) argument reordering and pass-by-reference: ";
    int n = 7;
    // _1,_2,_3参数的顺序
    auto f1 = std::bind(f, _2, 42, _1, _3, n);
    n = 10;
    // 参数的对应关系为:1--》n3,2-->n1,42--->n2,1001-->n4,n-->n5
    f1(1, 2, 1001);  
    std::cout << "2) achieving the same effect using a lambda: ";
}

输出结果:
1) argument reordering and pass-by-reference: 2 42 1 1001 7
2) achieving the same effect using a lambda:

2.bind对Class的使用例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <random>
#include <iostream>
#include <memory>
#include <functional>
 
struct Foo {
    void print_sum(int n1, int n2)
{
        std::cout << n1+n2 << '\n';
    }
    int data = 10;
};
 
int main()
{
    using namespace std::placeholders;  // for _1, _2, _3...
    std::cout << "1) bind to a pointer to member function: ";
    Foo foo;
    // 这里的&foo就是为了补齐成员变量里面的默认参数this
    auto f3 = std::bind(&Foo::print_sum, &foo, 95, _1);
    f3(5);
    std::cout << "2) bind to a mem_fn that is a pointer to member function: ";
    
}
执行结果:
1) bind to a pointer to member function: 100
2) bind to a mem_fn that is a pointer to member function:

另一个是:可以使用std:ref和std:cref来使用引用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <functional>
#include <iostream>
 
void f(int& n1, int& n2, const int& n3)
{
    std::cout << "In function: " << n1 << ' ' << n2 << ' ' << n3 << '\n';
    ++n1; // increments the copy of n1 stored in the function object
    ++n2; // increments the main()'s n2
    // ++n3; // compile error
}
 
int main()
{
    int n1 = 1, n2 = 2, n3 = 3;
    std::function<void()> bound_f = std::bind(f, n1, std::ref(n2), std::cref(n3));
    n1 = 10;
    n2 = 11;
    n3 = 12;
    std::cout << "Before function: " << n1 << ' ' << n2 << ' ' << n3 << '\n';
    bound_f();
    std::cout << "After function: " << n1 << ' ' << n2 << ' ' << n3 << '\n';
}
执行结果:
Before function: 10 11 12
In function: 1 11 12
After function: 10 12 12

https://en.cppreference.com/w/cpp/utility/functional/bind

https://cloud.tencent.com/developer/article/1474565

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-01-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 灰子学技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C++可调用Callable类型的总结
自从在使用 std::thread 构造函数过程中遇到了 Callable 类型的概念以来用到了很多关于它的使用. 因此本文把使用/调查结果总结出来. 包括 Callable 的基础概念, 典型的 Callable 类型介绍. 例如函数对象(狭义), 函数指针, lambda 匿名函数, 函数适配器, std::function 仿函数等.
高性能架构探索
2023/09/05
2940
C++可调用Callable类型的总结
c++中ref的作用
C++11 中引入 std::ref 用于取某个变量的引用,这个引入是为了解决一些传参问题。
zayyo
2023/11/30
4280
【C++】:bind绑定器和function函数对象机制
在C++中工程实践中,bind绑定器和function函数对象非常常用,而且bind+function简直就是无敌的存在。本篇博客中,我们力求用最小的成本搞懂它们,让你用起来得心应手
破晓的历程
2024/10/09
1690
C++11 std::bind std::function 高级使用方法[通俗易懂]
Hello world ! sumFunc.Call<int>(1, 2, 3) : 6
全栈程序员站长
2022/02/04
9970
诡异!std::bind in std::bind 编译失败
当时看了报错,简单的以为跟之前遇到的原因一样,随即提出了解决方案,怎奈,短短几分钟,就被无情打脸,啪啪啪😭。为了我那仅存的一点点自尊,赶紧看下原因,顺便把之前的问题也回顾下。
高性能架构探索
2023/06/13
7930
诡异!std::bind in std::bind 编译失败
C++之std::function、std::bind、lambda特性
std::function 是 C++11 标准库中的一个模板类,它可以用于包装任何可调用对象(函数、函数指针、成员函数、lambda 表达式等),并提供一种统一的方式来管理和调用这些可调用对象。
Linux兵工厂
2024/04/15
8370
C++之std::function、std::bind、lambda特性
C++编程经验(11):std::function 和 bind绑定器
在前面C++集群的项目里面大量应用到了绑定器来做解耦操作,那么,绑定器到底是什么呢?有什么玄妙的地方嘞?
看、未来
2021/10/09
1.4K0
C++编程经验(11):std::function 和 bind绑定器
想看懂WebRtc,你须知道的C++11新特性「lambda,std::function以及std:bind」
在本文中,我们来聊一下lambda表达式,闭包,std::function以及std::bind。
音视频_李超
2020/04/02
8430
C++ 新特性学习(四) — Bind和Function
木有错,这是C++,并且很方便地实现了委托 这就是传说中的绑定库和增强型的函数对象 接下来一个一个来
owent
2018/08/01
2.5K0
std::function与std::bind使用总结
C++中函数指针的用途非常广泛,例如回调函数,接口类的设计等,但函数指针始终不太灵活,它只能指向全局或静态函数,对于类成员函数、lambda表达式或其他可调用对象就无能为力了,因此,C++11推出了std::function与std::bind这两件大杀器。
forrestlin
2019/07/29
11.4K0
[C++11札记]: std::bind
在上一篇文章中,我们提到可调用对象(callable object),其中一种就是std::bind表达式。在这篇文章中,我们来谈谈std::bind表达式。
云水木石
2019/07/02
1.5K0
参数绑定---bind函数
为了用check_size来代替lambda,如何解决一元谓词接受一个参数的问题呢?
大忽悠爱学习
2021/11/15
1.2K0
[C++11] 包装器 : function 与 bind 的原理及使用
std::function 是⼀个类模板,也是一个通用的、多态函数包装器,用于存储可调用对象。函数指针、仿函数、 lambda 等可调⽤对象的类型各不相同,<font style="color:rgb(31,35,41);">std::function</font>的优势就是统⼀类型,对他们都可以进⾏包装,这样在很多地⽅就⽅便声明可调⽤对象的类型。
DevKevin
2024/11/15
2100
[C++11] 包装器 : function 与 bind 的原理及使用
C/C++开发基础——lambda表达式与std::bind闭包
lambda表达式是从C++11开始引入的,主要用来定义匿名函数和闭包。lambda表达式可以被当作一个值赋给另一个变量,也可以作为实参传递给其他函数,或者作为其他函数的返回结果,用法类似于前面提到的函数对象和函数指针。如果只是把单个函数拿来传参,lambda表达式的使用方式比函数指针和函数对象更简洁。
Coder-ZZ
2023/03/08
1K0
C/C++开发基础——lambda表达式与std::bind闭包
蓝桥ROS机器人之现代C++学习笔记3.2 函数对象包装器
程序示例如下: #include <functional> #include <iostream> using foo = void(int); // function pointer void functional(foo f) { f(1); } int foo2(int para) { return para; } int foo3(int a, int b, int c) { return 0; } int main() { auto f = [](int
zhangrelay
2022/04/29
2770
蓝桥ROS机器人之现代C++学习笔记3.2 函数对象包装器
【Example】C++ 回调函数及 std::function 与 std::bind
回调函数是做为参数传递的一种函数,在早期C样式编程当中,回调函数必须依赖函数指针来实现。
芯片烤电池
2022/04/27
5K0
【C++11】 函数适配:深入理解std::bind与占位符
🔄 std::bind 是C++11引入的函数适配工具,用于绑定函数参数或调整参数顺序,生成新的可调用对象。它位于头文件中,常用于:
IsLand1314
2025/03/17
500
第 10 章 泛型算法
第 10 章 泛型算法 标签: C++Primer 学习记录 泛型算法 ---- 第 10 章 泛型算法 10.1 概述 10.2 初识泛型算法 10.3 定制操作 10.4 再探迭代器 10.5 泛型算法结构 10.6 特定容器算法 ---- 10.1 概述 泛型算法,不仅作用于标准库容器,还可以适用于内置的数组类型。 迭代器令算法不依赖于容器,但算法本身可能依赖于元素类型的操作。如 find算法需要使用元素类型的==运算符、sort算法需要使用<运算符。泛型算法本身不会执行容器的操作,它们只会运行与迭
用户1653704
2018/06/07
8410
c++ 11 bind_箭头函数可以用bind吗
可以将bind函数看作是一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来“适应”原对象的参数列表。 调用bind的一般形式:auto newCallable = bind(callable,arg_list);`
全栈程序员站长
2022/11/17
7760
理解C++ std::function灵活性与可调用对象的妙用
C++中的std::function是一个强大而灵活的工具,它允许我们将可调用对象(函数、函数指针、Lambda表达式等)包装成一个对象,使得我们可以像操作其他对象一样操作和传递可调用对象。本文将深入探讨std::function的使用方式、内部实现机制以及一些高级应用。
Linux兵工厂
2024/02/17
2.2K0
理解C++ std::function灵活性与可调用对象的妙用
推荐阅读
相关推荐
C++可调用Callable类型的总结
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文