函数指针、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. python 图片相关

    python 图片相关 本篇介绍两种方式来打开图片. 1: 使用matplotlib #!/usr/bin/python3 # -*- coding: UTF-8 -*- ""&q ...

  2. python自动化测试相关资料

     java神功: https://yuedu.baidu.com/ebook/10f4bf7530126edb6f1aff00bed5b9f3f80f7212   selenium书:https:// ...

  3. 【经典问题】mysql和redis数据一致性问题

    前言 MySQL和Redis数据一致性算是个很经典的问题,在之前也看到过很多相关的文章,最近心血来潮,想把一致性问题的解决方案和存在问题都总结一下. 不推荐方案 1 先更新MySQL,再更新Redis ...

  4. 如何在GitHub正确提PR(Pull Requests),给喜欢的开源项目贡献代码

    最好的中文TTS项目Bert-vits2更新了中文特化分支,但可能由于时间仓促,代码中存在不少的bug,作为普通用户,有的时候也想为自己喜欢的开源项目做一点点贡献,帮助作者修改一些简单的bug,那么该 ...

  5. 高版本jdk的访问私有成员属性的正确姿势

    在jdk17+已经不能直接通过 setAccessible 来访问私有属性了 Field name = access.getClass().getDeclaredField("name&qu ...

  6. Java 给PPT中的表格设置分布行和分布列

    在表格中可设置"分布行"或"分布列"将行高.列宽调整为协调统一的高度或宽度,是一种快速实现表格排版的方法之一.下面,通过Java后端程序代码介绍如何在PPT幻灯 ...

  7. 毕业季 | 程序员初入职场必备软件开发神器,华为云Astro带你开启新篇章

    摘要:5分钟写出应用,10分钟开发大屏,新手程序员必学技能之华为云Astro,快来get. 本文分享自华为云社区<毕业季 | 程序员初入职场必备软件开发神器,华为云Astro带你开启新篇章> ...

  8. Python从零到壹丨带你了解图像直方图理论知识和绘制实现

    摘要:本文将从OpenCV和Matplotlib两个方面介绍如何绘制直方图,这将为图像处理像素对比提供有效支撑. 本文分享自华为云社区<[Python从零到壹] 五十.图像增强及运算篇之图像直方 ...

  9. 测试用例又双叒叕失败了,NLP帮你

    摘要:本文将介绍如何使用AI技术实现失败测试用例的智能分析. 本文分享自华为云社区<测试用例又双叒叕失败了,啥原因?NLP帮你来分析>,作者: 敏捷的小智 . 随着软件行业的快速发展,为了 ...

  10. HIVE报错 need to specify partition columns because the destination table is partitioned

    解决 分区需要指定分区 insert into table XXX partition(分区='')