首页 > 其他分享 >cpp:"函数指针"的方法

cpp:"函数指针"的方法

时间:2024-03-14 17:11:54浏览次数:48  
标签:std function 函数 int 捕获 func cpp 函数指针 方法

目录
函数对象有这几类:

仿函数类

即重载operator()

class FuncObjType
{
public:
    void operator() ()
    {
        cout<<"Hello C++!"<<endl;
    }
};

std::function类

即上文中func_type

std::function<float(float,float)>  func;// 等同于 int (*func)(int a, int b);//func是一个变量

//仿函数赋值
func= std::fmaxf; //等同于func=addFunc;

//一般函数赋值
func=std::bind(&类名::函数名,类对象,_1,_2);

// 存储到成员函数的调用
std::function<void(const Foo&, int)> f_add_display = &Foo::print_add;
const Foo foo(314159);
f_add_display(foo, 1);
f_add_display(314159, 1);


std::function做形参

void function(std::function<flaot(float,float)> FUNC, other)

Lambda类

[ 捕获 ] ( 形参列表 )(可选) lambda说明符 { 函数体 }

lambda函数

Lambda 表达式 (C++11 起) - cppreference.com

[ 捕获 ] ( 形参列表 )(可选) lambda说明符 { 函数体 }

捕获

  • [] 什么也不捕获,无法lambda函数体使用任何

  • [=] 按值的方式捕获所有变量,这个值是const类型的,lambda函数体中不可有直接修改这个值的操作

  • [&] 按引用的方式捕获所有变量

  • [=, &a] 除了变量a之外,按值的方式捕获所有局部变量,变量a使用引用的方式来捕获。这里可以按引用捕获多个,例如 [=, &a, &b,&c]。这里注意,如果前面加了=,后面加的具体的参数必须以引用的方式来捕获,否则会报错。

  • [&, a] 除了变量a之外,按引用的方式捕获所有局部变量,变量a使用值的方式来捕获。这里后面的参数也可以多个,例如 [&, a, b, c]。这里注意,如果前面加了&,后面加的具体的参数必须以值的方式来捕获。

  • [a, &b] 以值的方式捕获a,引用的方式捕获b,也可以捕获多个。

  • [this] 在成员函数中,也可以直接捕获this指针,其实在成员函数中,[=]和[&]也会捕获this指针。

案例

int x = 1; int y = 2;
auto plus = [=] (int a, int b) -> int { return x + y + a + b; };
int c = plus(1, 2);

标签:std,function,函数,int,捕获,func,cpp,函数指针,方法
From: https://www.cnblogs.com/getonechao/p/18073304

相关文章

  • cpp:const引出的那些事
    1.常变量constinti=10;intconsti=10;两种表达方式没区别2.指针与const如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量。利用英文从右边往左边读,并且以to为分界,to......
  • 零基础自学网络安全 / 网络渗透攻防路线学习方法【建议收藏】
    学前感言:1.这是一条坚持的道路,三分钟的热情可以放弃往下看了.2.多练多想,不要离开了教程什么都不会了.最好看完教程自己独立完成技术方面的开发.3.有时多google,baidu,我们往往都遇不到好心的大神,谁会无聊天天给你做解答.4.遇到实在搞不懂的,可以先放放,以后再来解决.......
  • CSharp的lambda表达式匿名类扩展方法
    c#的lamba表达式之前已经写过一些关于委托还有事件的文章,今天就来介绍一下lambda表达式。首先定义需要的函数以及委托{publicdelegatevoidDoNothingDelegate();publicdelegatevoidStudyDelegate(intid,stringname);privatevoidDoNothing(){Console.WriteL......
  • ros2中Qos的C++配置方法
    1.dds_debug.hpp#ifndefDDS_DEBUG__DDS_DEBUG_HPP_#defineDDS_DEBUG__DDS_DEBUG_HPP_#include<rclcpp/rclcpp.hpp>#include<rclcpp/qos.hpp>#include<rmw/types.h>#include<sensor_msgs/msg/imu.hpp>constrmw_qos_profile_tmy_cus......
  • #微信小程序(轮播图以及开发方法)
    1.IDE:微信开发者工具2.实验:轮播图以及正确的开发方法(1)有HTML,CSS,javascript基础即可(2)写界面一定要查看开发手册,这是微信小程序比较好的地方,由于是国内软件有中文开发手册。手册地址,直接搜---->微信小程序----->开发文档。网址:视图容器/swiper(qq.com)https://developers......
  • Python 中 Panda 库 处理表格方法
    1.导入Pandas库importpandasaspd2.创建DataFrame对象#从列表创建data=[['Alice',25],['Bob',30],['Charlie',35]]df=pd.DataFrame(data,columns=['Name','Age'])#从字典创建data={'Name':[&#......
  • cpp website资源汇总
    社区purecpp:acoolopensourcemodernc++communitytotw:C++TipsoftheWeekhackingC++:BestC++ProgrammingBlogsin2023TheBestBlogsandWebsitesThemostinterestingblogsandwebsitesforC++developers/HabrCPlusPlusThings:C++那些事参......
  • 滴水逆向笔记系列-c语言总结6-20.多级指针 数组指针 函数指针-21.位运算-22.内存分配
    第二十课c语言13多级指针数组指针函数指针1.多级指针反汇编一二级指针可以看到p1==*(p1+0)==p1[0]本来一直没想懂为什么是movsxecx,byteptr[eax],是byte,才发现p1是char类型,所以才得用movsx拓展(p1+2)==p1[2],指针可以用和[]取值,他们是一样的(((p3+1)+2)+3)==p3[......
  • Vue — vue中带有$的属性和方法
    在Vue.js中,以$开头的属性通常是框架内部提供的特殊属性或方法,用于访问Vue实例的一些内部属性或执行特定的操作。以下是一些常见的以$开头的属性:属性:1.$data:Vue实例的数据对象,包含实例中定义的数据。constapp=newVue({data:{message:'Hello,Vue!'}......
  • CMD FIFO的深入理解:一种避免占用总线带宽的仲裁方法
    研究了一晚上CMDFIFO的写法,以及通过相关的咨询以后,我得到了一些结论:1.CMDFIFO是一种面对仲裁有效的处理方法,这种写法意味把你需要的数据按照突发事件的形式隔离:1.1.每满足一次需求向FIFO中写入一次地址和命令,这些地址和命令会在总线空闲的时候被执行;2.不使用CMDFIFO也是......