函数指针、std::function、std::bind
函数指针、std::function、std::bind
函数指针:
C++语法中可以直接将函数名作为指针,
void fun(int a, int b);
在这个函数声明中,函数指针即为
fun,传入要被调用的地方时只需要传入fun就可以。但是这个函数指针是什么类型呢?需要明确函数指针类型及其写法,我们才能在要调用函数的形参处正确说明此处参数是一个函数指针的意图。对于上述的函数指针类型为:
void(int, int).即需要以函数的返回值,函数形参类型组合来指定一个函数类型,就像是指定一个整型变量或者浮点型变量。整体赋值语句为:
void(*fp)(int, int) = fun.fp指针上就被赋予了fun函数的代码起始地址,注意由于优先级*较低,如果不加括号,编译器就会将void*连在一起,意思是返回空指针了。函数指针调用:
void callback(void(*fp)(int, int) ){
fp(1,2);
(*fp)(1,2);
}
这两种调用写法都是对的(虽然理论上应该是第二种写法)
std::function
std::function实现了与函数指针类似的功能,将函数包装成了一个可调用对象,用法与函数指针一样。
std::function<void(int, int)> fp = fun;
赋值语句整体与上述相同,但是它将函数指针完全分离成了一个可以视作类型的东西,可以想想std::function<void(int, int)>其实就是类比自定义的类名className
整体来看更加清晰,在调用时,也完全可以把它作为一个对象来调用,函数参数可以类比为类的构造参数。如:fp(1, 2)
In less abstruse English, it means that
std::functioncan contain almost any object that acts like a function pointer in how you call it.
为了简单的表示:以上赋值语句也可以分为两句:
using myName = std::function<void(int, int)>
myName fp = fun;
std::bind
作用是绑定函数与参数,返回function对象,就类似于给定一个默认值,比如对于上面的有两个int参数的函数:
std::function<void(int, int)> fp = std::bind(fun, std::place_holder::_1, std::place_holder::_2);
std::function<void(int)> fp = std::bind(fun, 1, std::place_holder::_1);
std::function<void()> fp = std::bind(fun, 1, 1);
注意,随着绑定参数个数的不同,返回值的类型也不同。
此外,bind也可以用于类外访问类内的私有函数,可以防止直接暴露给外界:

函数指针、std::function、std::bind的更多相关文章
- c++11——std::function和bind绑定器
c++11中增加了std::function和std::bind,可更加方便的使用标准库,同时也可方便的进行延时求值. 可调用对象 c++中的可调用对象存在以下几类: (1)函数指针 (2)具有ope ...
- C++11 学习笔记 std::function和bind绑定器
C++11 学习笔记 std::function和bind绑定器 一.std::function C++中的可调用对象虽然具有比较统一操作形式(除了类成员指针之外,都是后面加括号进行调用),但定义方法 ...
- std::function,std::bind复习
#include <iostream> #include <functional>//std::bind返回函数对象 void fun1(int a, int b) { std ...
- C++中的仿函数,std::function和bind()的用法
1.仿函数:又叫std::function,是C++中的一个模板类 2.C语言中的函数指针: int add(int a,int b) { return a+b; } typedef int (*f ...
- C++ 11 std::function std::bind使用
cocos new 出新的项目之后,仔细阅读代码,才发现了一句3.0区别于2.0的代码: auto closeItem = MenuItemImage::create( "CloseNorm ...
- C++11学习笔记之三lamda表达式,std::function, std::bind
//lamda //first lamda [] {}; // second lamda []() //or no need () when paramater is null { std::cout ...
- 指向函数的指针 ------ 函数指针(function pointer)
函数指针: 指向函数的指针, 首先是一个指针, 这个指针指向一个函数. 函数具有可赋值给指针的物理内存地址,一个函数的函数名就是一个指针,它指向函数的代码.一个函数的地址是该函数的进入点,也是调用函数 ...
- javascript 一些函数的实现 Function.prototype.bind, Array.prototype.map
* Function.prototype.bind Function.prototype.bind = function() { var self = this, context = [].shift ...
- 【浅析C++11】std::function和std::bind
目录 std::function可调用对象包装器 std::function基本用法 std::function/std::bind与抽象工厂.工厂方法的一点思考 std::function可调用对象 ...
- C/C++ C++ 11 std::function和std::bind用法
std::bind() std::bind 主要用于绑定生成目标函数,一般用于生成的回调函数,cocos的回退函数都是通过std::bind和std::function实现的.两个点要明白: 1.绑定 ...
随机推荐
- 11 个步骤完美排查Linux服务器是否被入侵
文章来源公众号:LemonSec 随着开源产品的越来越盛行,作为一个Linux运维工程师,能够清晰地鉴别异常机器是否已经被入侵了显得至关重要,个人结合自己的工作经历,整理了几种常见的机器被黑情况供参考 ...
- 文心一言 VS 讯飞星火 VS chatgpt (23)-- 算法导论4.2 5题
五.V.Pan 发现一种方法,可以用 132 464 次乘法操作完成 68 x 68 的矩阵相乘,发现另一种方法,可以用 143 640 次乘法操作完成 70 x 70 的矩阵相乘,还发现一种方法,可 ...
- 以小博大外小内大,Db数据库SQL优化之小数据驱动大数据
SQL优化中,有一条放之四海而皆准的既定方针,那就是:永远以小数据驱动大数据.其本质其实就是以小的数据样本作为驱动查询能够优化查询效率,在SQL中,涉及到不同表数据的连接.转移.或者合并,这些操作必须 ...
- 物联网常见协议之Amqp协议及使用场景解析
摘要:本文围绕AMQP协议,为大家详细解析AMQP协议.核心技术亮点.多协议之间的对比以及使用实践. 本文分享自华为云社区<物联网常见协议之Amqp协议及使用场景解析>,作者:张俭. 引言 ...
- 讲透学烂二叉树(三):二叉树的遍历图解算法步骤及JS代码
二叉树的遍历是指不重复地访问二叉树中所有结点,主要指非空二叉树,对于空二叉树则结束返回. 二叉树的遍历分为 深度优先遍历 先序遍历:根节点->左子树->右子树(根左右),有的叫:前序遍历 ...
- Kafka--简介,部署
kafka官网:https://kafka.apache.org/documentation/ 本文kafka版本:3.1.0 一.简介 Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消 ...
- dmesg 时间误差现象
案例现象 这天收到监控平台发来的告警,说有台机器程序崩溃了 因为以前也有过相关的错误,根据经验,用 dmesg命令看下内核信息 发现有点不对劲,报错信息的时间跟告警时间不一致,正常来讲报错时间应该跟告 ...
- Step by step guide to becoming a C++ developer in 2023
https://roadmap.sh/cpp https://roadmap.sh/backend
- Codeforces 189 A. Cut Ribbon(DP 恰装满的完全背包问题)
题目链接 Polycarpus has a ribbon, its length is n. He wants to cut the ribbon in a way that fulfils the ...
- Problem 550A - Two Substrings
A - Two Substrings You are given string s. Your task is to determine if the given strings contains t ...