Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >函数指针、函数对象、lambda 表达式、std::function

函数指针、函数对象、lambda 表达式、std::function

作者头像
JoeyBlue
发布于 2022-05-19 05:43:46
发布于 2022-05-19 05:43:46
1.2K00
代码可运行
举报
文章被收录于专栏:代码手工艺人代码手工艺人
运行总次数:0
代码可运行

1. 函数指针

函数指针就是指向函数地址的指针

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int Sum(int a, int b) {
	return a + b;
}

typedef int(*SumFunc)(int x, int y);

// --------

SumFunc sum = Sum;
std::cout << sum(1, 2) << std::endl;

2. 函数对象

重载了 operator() 的类对象:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class SumClass {
public: 
	SumClass(int padding): padding(padding){}
	
	int operator()(int a, int b) {
		return a + b + padding;
	}
	
private:
	int padding;
};

// ---------------------

SumClass sumObj(3);
std::cout << sumObj(1, 2) << std::endl;

3. Lambda 表达式

lambda 表达式内部会创建一个上面所说的函数对象, 不过是匿名的, 只有编译器知道类名是什么. lambda 可以捕获外部的变量, 都会转换为匿名函数对象的属性值来保存.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int padding = 3;
auto sum_lambda = [padding](int a, int b) -> int {
	return a + b + padding;
};
std::cout << sum_lambda(1, 2) << std::endl;

4. std::function

C++ 对 std::function 的描述:

Class template std::function is a general-purpose polymorphic function wrapper

Instances of std::function can store, copy, and invoke any CopyConstructible Callable target–functions, lambda expressions, bind expressions, or other function objects, as well as pointers to member functions and pointers to data members

std::function 是一个函数包装器模板,一个 std::function 类型对象可以包装以下类型:

  • 函数指针
  • 类成员函数指针 (如使用 std::bind 传递)
  • 函数对象(定义了 operator() 操作符的类对象)

既然能包装这些类型, 也相当于可以从这些类型转换过来:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class TestClass {
public:
  int Sum(int x, int y) {
    return x + y;
  }
};

// ---------------------

// 包装函数指针
std::function<int(int, int)> sum_func_1 = sum;
std::cout << sum_func_1(1, 2) << std::endl;;

// 包装函数对象
std::function<int(int, int)> sum_func_2 = sumObj;
std::cout << sum_func_2(1, 2) << std::endl;;

// 包装 Lambda (即便 capture 了参数)
std::function<int(int, int)> sum_func_3 = sum_lambda;
std::cout << sum_func_3(1, 2) << std::endl;;

// 包装类成员函数指针
TestClass test_obj;
using std::placeholders::_1;
using std::placeholders::_2;
std::function<int(int, int)>  sum_func_4 = std::bind(&TestClass::Sum, &test_obj, _1, _2);
std::cout << sum_func_4(1, 2) << std::endl;;

5. 相互转换

  • 4 中提到的都可以转换为 std::function
  • 没有什么可以直接转换为 lambda
  • 一个没有捕获变量的 lambda 函数, 可以显式转换成函数指针:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// lambda without capturing any value -> function ptr
SumFunc func_ptr = [/*padding (error) */](int x, int y) -> int {
  return x + y;
};
std::cout << func_ptr(1, 2) << std::endl;;
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-03-012,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C++之std::function、std::bind、lambda特性
std::function 是 C++11 标准库中的一个模板类,它可以用于包装任何可调用对象(函数、函数指针、成员函数、lambda 表达式等),并提供一种统一的方式来管理和调用这些可调用对象。
Linux兵工厂
2024/04/15
8780
C++之std::function、std::bind、lambda特性
function和bind
仿函数的定义:仿函数(functor),它的行为类似于函数的东西(something that performs a function)
无敌清风蓝
2024/06/04
1230
【Example】C++ 回调函数及 std::function 与 std::bind
回调函数是做为参数传递的一种函数,在早期C样式编程当中,回调函数必须依赖函数指针来实现。
芯片烤电池
2022/04/27
5.1K0
【C++】:bind绑定器和function函数对象机制
在C++中工程实践中,bind绑定器和function函数对象非常常用,而且bind+function简直就是无敌的存在。本篇博客中,我们力求用最小的成本搞懂它们,让你用起来得心应手
破晓的历程
2024/10/09
1900
C++11-lambda表达式/包装器/线程库
捕捉列表,该列表总是出现在lambda函数的开始位置,编译器根据[]来判断接下来的代码是否为lambda函数,捕捉列表能够捕捉上下文中的变量供lambda函数使用
用户9645905
2022/11/30
1.2K0
C++11-lambda表达式/包装器/线程库
让类成员函数指针成为可调用对象
    类成员函数指针实践上是一个指针类型,不可直接通过调用运算符()作为可调用对象调用,一般调用该类成员函数指针需要指定该指针对应的对象。
学徒漠筱歌
2022/07/17
1.2K0
C++可调用Callable类型的总结
自从在使用 std::thread 构造函数过程中遇到了 Callable 类型的概念以来用到了很多关于它的使用. 因此本文把使用/调查结果总结出来. 包括 Callable 的基础概念, 典型的 Callable 类型介绍. 例如函数对象(狭义), 函数指针, lambda 匿名函数, 函数适配器, std::function 仿函数等.
高性能架构探索
2023/09/05
3210
C++可调用Callable类型的总结
4.6 C++ Boost 函数绑定回调库
Boost 库是一个由C/C++语言的开发者创建并更新维护的开源类库,其提供了许多功能强大的程序库和工具,用于开发高质量、可移植、高效的C应用程序。Boost库可以作为标准C库的后备,通常被称为准标准库,是C标准化进程的重要开发引擎之一。使用Boost库可以加速C应用程序的开发过程,提高代码质量和性能,并且可以适用于多种不同的系统平台和编译器。Boost库已被广泛应用于许多不同领域的C++应用程序开发中,如网络应用程序、图像处理、数值计算、多线程应用程序和文件系统处理等。
王瑞MVP
2023/08/21
3220
C++11中lambda表达式与包装器
在C++98中,如果想要对一个数据集合中的元素进行排序,可以使用std::sort方法。
用户11317877
2024/10/31
890
C++11中lambda表达式与包装器
C++11新特性探索:Lambda表达式与函数包装器的实用指南
C++11 的发布为现代 C++ 带来了许多革命性的特性,其中 Lambda 表达式和函数包装器是提升代码简洁性和灵活性的代表性工具。Lambda 表达式让开发者能够像函数一样轻松地创建匿名函数,而函数包装器则为灵活地管理和调用可调用对象提供了一个强大的抽象。在这篇文章中,我们将详细探讨 Lambda 表达式和函数包装器的概念、用法以及它们如何在实际项目中提升代码的可读性和效率。
suye
2024/11/26
1730
C++函数、虚函数和函数对象:从基础到应用
在C++编程中,函数、虚函数和函数对象是三个重要的概念。它们在程序设计中扮演着不同的角色,理解它们的区别和应用场景对于编写高效、灵活的代码至关重要。本文将详细探讨这三者的定义、特点、使用场景以及更进一步的引申,并通过实例帮助读者更好地理解这些概念。
码事漫谈
2024/12/27
2050
C++函数、虚函数和函数对象:从基础到应用
【c++11】包装器
包装器(Wrapper) 是一个常见的编程设计模式,通常用于封装或“包装”某个现有的对象、函数、数据结构或者操作,以提供额外的功能或简化接口。在不同的上下文中,包装器可能有不同的实现方式和目的,但核心思想都是“将现有功能封装起来,以实现更强的扩展性、易用性或者功能分离”。
用户11029103
2025/02/03
1050
【c++11】包装器
C++编程经验(11):std::function 和 bind绑定器
在前面C++集群的项目里面大量应用到了绑定器来做解耦操作,那么,绑定器到底是什么呢?有什么玄妙的地方嘞?
看、未来
2021/10/09
1.5K0
C++编程经验(11):std::function 和 bind绑定器
C/C++开发基础——lambda表达式与std::bind闭包
lambda表达式是从C++11开始引入的,主要用来定义匿名函数和闭包。lambda表达式可以被当作一个值赋给另一个变量,也可以作为实参传递给其他函数,或者作为其他函数的返回结果,用法类似于前面提到的函数对象和函数指针。如果只是把单个函数拿来传参,lambda表达式的使用方式比函数指针和函数对象更简洁。
Coder-ZZ
2023/03/08
1K0
C/C++开发基础——lambda表达式与std::bind闭包
理解C++ std::function灵活性与可调用对象的妙用
C++中的std::function是一个强大而灵活的工具,它允许我们将可调用对象(函数、函数指针、Lambda表达式等)包装成一个对象,使得我们可以像操作其他对象一样操作和传递可调用对象。本文将深入探讨std::function的使用方式、内部实现机制以及一些高级应用。
Linux兵工厂
2024/02/17
2.3K0
理解C++ std::function灵活性与可调用对象的妙用
lambda表达式的高阶用法
//lambda表达式使得STL中的 ”_f“簇算法 std::find_if, std::remove_if,std::count_if
用户9831583
2022/12/04
1.4K0
lambda表达式的高阶用法
【C++】C++11的新特性 — function 包装器 , bind包装器
function包装器也叫作适配器。C++中的function本质是一个类模板,也是一个包装器。
叫我龙翔
2024/08/13
1550
【C++】C++11的新特性 — function 包装器 , bind包装器
c/c++补完计划(六): 语法糖lambda
前言 很多语言都有lambda, c++自然不能缺, 在c++11里面加入了, 是程序猿喜欢的语法糖, 便于阅读, 也便于理解. 当然, 它有很多相关概念, 这里尽可能展开说. lambda表达式 [capture list] (params list) mutable exception-> return type { function body } 捕获子句(在c++规范中也称为lambda引导) 参数列表可有可无. (也称为lambda 声明符) 可变规范可有可无. 异常规范可有可无. 尾随-返
sean_yang
2020/08/11
5810
C/C++开发基础——函数对象与std::function模板
函数对象可以被当作一个值赋给另一个变量,也可以作为实参传递给其他函数,或者作为其他函数的返回结果。
Coder-ZZ
2023/02/23
9050
C/C++开发基础——函数对象与std::function模板
【C++11】解锁C++11新纪元:深入探索Lambda表达式的奥秘
前言:在C++编程语言的悠久历史中,每一次标准的更新都带来了革命性的变化,推动了编程范式和性能优化的新边界。C++11标准,作为这一漫长演进过程中的一个重要里程碑,不仅巩固了C++作为高性能系统级编程语言的地位,还引入了众多现代编程特性,极大地丰富了C++的表达力和易用性。其中,lambda表达式和std::function无疑是这些新特性中最引人注目且影响深远的两个
Eternity._
2024/08/05
1130
【C++11】解锁C++11新纪元:深入探索Lambda表达式的奥秘
相关推荐
C++之std::function、std::bind、lambda特性
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验