函数指针、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::function can 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的更多相关文章

  1. c++11——std::function和bind绑定器

    c++11中增加了std::function和std::bind,可更加方便的使用标准库,同时也可方便的进行延时求值. 可调用对象 c++中的可调用对象存在以下几类: (1)函数指针 (2)具有ope ...

  2. C++11 学习笔记 std::function和bind绑定器

    C++11 学习笔记 std::function和bind绑定器 一.std::function C++中的可调用对象虽然具有比较统一操作形式(除了类成员指针之外,都是后面加括号进行调用),但定义方法 ...

  3. std::function,std::bind复习

    #include <iostream> #include <functional>//std::bind返回函数对象 void fun1(int a, int b) { std ...

  4. C++中的仿函数,std::function和bind()的用法

    1.仿函数:又叫std::function,是C++中的一个模板类 2.C语言中的函数指针: int  add(int a,int b) { return a+b; } typedef int (*f ...

  5. C++ 11 std::function std::bind使用

    cocos new 出新的项目之后,仔细阅读代码,才发现了一句3.0区别于2.0的代码: auto closeItem = MenuItemImage::create( "CloseNorm ...

  6. C++11学习笔记之三lamda表达式,std::function, std::bind

    //lamda //first lamda [] {}; // second lamda []() //or no need () when paramater is null { std::cout ...

  7. 指向函数的指针 ------ 函数指针(function pointer)

    函数指针: 指向函数的指针, 首先是一个指针, 这个指针指向一个函数. 函数具有可赋值给指针的物理内存地址,一个函数的函数名就是一个指针,它指向函数的代码.一个函数的地址是该函数的进入点,也是调用函数 ...

  8. javascript 一些函数的实现 Function.prototype.bind, Array.prototype.map

    * Function.prototype.bind Function.prototype.bind = function() { var self = this, context = [].shift ...

  9. 【浅析C++11】std::function和std::bind

    目录 std::function可调用对象包装器 std::function基本用法 std::function/std::bind与抽象工厂.工厂方法的一点思考 std::function可调用对象 ...

  10. C/C++ C++ 11 std::function和std::bind用法

    std::bind() std::bind 主要用于绑定生成目标函数,一般用于生成的回调函数,cocos的回退函数都是通过std::bind和std::function实现的.两个点要明白: 1.绑定 ...

随机推荐

  1. Spingboot整合Dubbo+zookeeper

    前言: 2023-12-26 19:38:05 最近学习分布式技术:Dubbo+zookeeper,准备写一个demo用springboot整合dubbo和zookeeper.但是看了网上一些教程都是 ...

  2. TypeScript Vs JavaScript 区别

    一.观察 1. JS 平常的复制类型 let val; val = 123; val = "123"; val = true; val = [1, 3, 5]; 注意点: 由于JS ...

  3. Pikachu漏洞靶场 Sql Inject(SQL注入)

    SQLi 哦,SQL注入漏洞,可怕的漏洞. 文章目录 SQLi 数字型注入(post) 字符型注入(get) 搜索型注入 xx型注入 "insert/update"注入 inser ...

  4. k8s 标签-2

    目录 标签-2 node的角色 修改node节点的角色,将他的角色修改成他的主机名 标签的作用 Cordon,Drain以及污点 Cordon--告警警戒 Drain 驱逐演示 污点 污点的Cordo ...

  5. Mybatis源码3 CachingExecutor, 二级缓存,缓存的实现

    Mybatis CachingExecutor, 二级缓存,缓存的实现 一丶二级缓存概述 上一章节,我们知道mybaits在构造SqlSession的时候,需要让SqlSession持有一个执行器,如 ...

  6. flutter常用的音乐播放器库

    audioplayers: 优势:audioplayers 是一个简单易用的音乐播放器库,支持主流平台(Android.iOS)并提供了丰富的功能,比如播放.暂停.快进.音量控制等. 缺点:audio ...

  7. JQuery中美元符号$

    目录 1. 概述 2. 详论 2.1. 加载脚本 2.2. 选择器 2.2.1. 元素选择器 2.2.2. ID选择器 2.2.3. 类选择器 2.3. 引入方法 3. 参考 1. 概述 前端技术得更 ...

  8. CUDA C编程权威指南:1.3-CUDA基础知识点梳理

      主要整理了N多年前(2013年)学习CUDA的时候开始总结的知识点,好长时间不写CUDA代码了,现在LLM推理需要重新学习CUDA编程,看来出来混迟早要还的. 1.CUDA数组 解析:CUDA数组 ...

  9. Java开发手册精华总结

    阿里 Java 开发手册的思考总结 一个优秀的工程师和一个普通的工程师的区别,不是满天飞的架构图,他的功底体现在所写的每一行代码上. -- 毕玄 1. 命名风格 [书摘]类名用 UpperCamelC ...

  10. 什么是Python中的套接字编程?

    摘要:本文涵盖了有关使用Python进行套接字编程的所有领域.套接字可以帮助您建立这些连接,而Python无疑可以简化连接. 本文分享自华为云社区<从零开始学python | 什么是Python ...