首页 > 其他分享 > 函数指针、std::function、std::bind

函数指针、std::function、std::bind

时间:2023-08-09 16:44:54浏览次数:36  
标签:std function int fp fun 函数指针

函数指针、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也可以用于类外访问类内的私有函数,可以防止直接暴露给外界:

image

标签:std,function,int,fp,fun,函数指针
From: https://www.cnblogs.com/fireinstone/p/17617217.html

相关文章

  • std::async的使用总结
    https://blog.csdn.net/weixin_41191739/article/details/113115847  vecotr<...>  async 其中的一种用法:#include<iostream>#include<vector>#include<string>#include<future>#include<algorithm>usingnamespacestd;s......
  • 【JavaScript27】关于Function
    js中所有的函数都是通过Function构建的.在没有修改过原型链的情况下.以下等式是成立的.console.log(fn.proto.constructor===Function.prototype.constructor);console.log(fn.proto.constructor===Function);varfn=newFunction("console.log(123456);");//Funct......
  • golang自定义 os.stderr 数据读取逻辑
    原始需求只是一个很简单的需求,使用golang的exec运行一个命令然后获取实时结果,命令是trivyimage--download-db-only正常的打印应该是2023-08-08T17:06:02.929+0800INFONeedtoupdateDB2023-08-08T17:06:02.929+0800INFODBRepository:ghcr.io/aquas......
  • c++ std::hash<std::string> 字符串哈希函数
    msvc采用了FNV-1a的哈希算法//众所周知std::string就是一个basic_string<char>template<class_Elem,class_Traits,class_Alloc>structhash<basic_string<_Elem,_Traits,_Alloc>>{_CXX17_DEPRECATE_ADAPTOR_TYPEDEFStypedefbasic_string<_......
  • 【JAVA8】快速理解Consumer、Supplier、Predicate与Function
                 快速理解Consumer、Supplier、Predicate与Function一、前言这几个接口都处在java.util.function包下,Consumer(消费型),Supplier(供给型)、Predicate(判断型)与Function(转换型),暂时不理解他们的类型没关系。如果对Lambda不怎么理解的同学,可以......
  • /lib64/libstdc++.so.6: version `GLIBCXX_3.4.26' not found
    原因使用的gcc没有找到对应的glib库。每个版本的glib都会有改变,所以使用的时候必须匹配。大部分是因为自己编译升级了gcc,再用新的gcc编译程序时没有找到当时匹配的类库。查找原因报错提示很明确了,/lib64/libstdc++.so.6中没有找到GLIBCXX_3.4.26版本内容。正常情况/lib64/lib......
  • mysql突然断电,无法启动问题, redo log 无法恢复 mysqld启动不了 Plugin 'InnoDB' init
    环境:CentOS7.x、MySQL5.7其实造成这种问题的原因有很多种,但是不管是什么问题,最终的原因一般是redolog造成的问题。为什么说是redolog造成的呢,因为redolog对应的文件就是两个ib_logfile开头的文件:ib_logfile0、ib_logfile1;下面的问题都是和ib_logfile有关。MySQL......
  • 双通道MIL-STD-1553B总线通讯模块
    *双通道MIL-STD-1553B总线通讯模块*32bi,33MHz CPCI/PCI/总线*每个通道为A、B双冗余总线*单功能可设置BC/RT/BM一种工作模式*数据传输率:4Mbps*支持32位时标,时标精度0.25微秒*软件可设詈应答超时:0-32767µs*大容量的数据存储:32Mx16bit*支持中断方式接收消息,可设......
  • std::shared_ptr 线程安全方面的思考
    一直惦记着std::shared_ptr线程安全的问题,看了些文章后,又怕过段时间忘记了,遂记录下来std::shared_ptr的线程安全问题主要有以下两种:引用计数的加减操作是否线程安全std::shared_ptr修改指向时是否线程安全第一个问题的答案:是线程安全的,因为是原子操作注意:引用计数这......
  • 30 天精通 RxJS (03):Functional Programming 通用函式
    了解FunctionalProgramming的通用函式,能让我们写出更简洁的代码,也能帮助我们学习RxJS。读者可能会很好奇,我们的主题是RxJS为什么要特别讲FunctionalProgramming的通用函式呢?实际上,RxJS核心的Observable操作观念跟FP的阵列操作是极为相近的,只学会以下几个基本的......