C++ 里面lambda和函数指针的转换

news/2024/11/29 6:37:30/

问题说明

原始问题,代码如下会编译报错:

using DecisionFn = bool(*)();class Decide
{
public:Decide(DecisionFn dec) : _dec{dec} {}
private:DecisionFn _dec;
};int main()
{int x = 5;Decide greaterThanThree{ [x](){ return x > 3; } };return 0;
}

原因分析

lambda表达式转成函数指针,当lambda没有捕获变量的时候,可以隐式转为指针函数

§ 5.1.2 The closure type for a lambda-expression with no
lambda-capture
has a public non-virtual non-explicit const conversion
function to pointer to function
having the same parameter and return
types as the closure type’s function call operator. The value returned
by this conversion function shall be the address of a function that,
when invoked, has the same effect as invoking the closure type’s
function call operator.

解决方案

当包含有捕获变量的时候,可以使用如下方式

  1. 把捕获的变量作为参数来传递
typedef bool(*DecisionFn)(int);Decide greaterThanThree{ []( int x ){ return x > 3; } };Decide greaterThanThree {(x > 3) ? [](){ return true; } : [](){ return false; }};
  1. 使用std::function来替代原始指针
using DecisionFn = std::function<bool()>;Decide greaterThanThree { [x](){ return x > 3; } };

参考:

https://stackoverflow.com/questions/7852101/c-lambda-with-captures-as-a-function-pointer
https://stackoverflow.com/questions/28746744/passing-capturing-lambda-as-function-pointer


http://www.ppmy.cn/news/96017.html

相关文章

【 TensorFlow】URLError: <urlopen error no host given> 错误的 有效的解决方法

URLError: 错误的 有效的解决方法&#x1f60e; 前言&#x1f64c;错误运行截图&#xff1a;解决方案流程图&#xff1a;运行成功截图 总结撒花&#x1f49e; &#x1f60e;博客昵称&#xff1a;博客小梦 &#x1f60a;最喜欢的座右铭&#xff1a;全神贯注的上吧&#xff01;&a…

[开发|java] greenrobot.eventbus的ThreadMode说明

GreenRobot EventBus 是一个事件总线库&#xff0c;其中的 ThreadMode 用于指定事件处理方法在哪个线程上执行。以下是 GreenRobot EventBus 中的几种 ThreadMode&#xff1a; ThreadMode.POSTING&#xff1a;事件发布和事件处理在同一个线程上执行。即事件发布的线程会立即调用…

RocketMQ启动失败

RocketMQ启动失败 报错信息 [rootVM-16-6-centos bin]# sh mqnamesrv Java HotSpot™ 64-Bit Server VM warning: Using the DefNew young collector with the CMS collector is deprecated and will likely be removed in a future release Java HotSpot™ 64-Bit Server VM …

数据结构基础内容-----第二章算法

文章目录 算法算法算法与数据结构算法的特性算法的设计应符合以下基本要求&#xff1a;函数的渐近增长 算法时间复杂度时间复杂度的平均情况和最坏情况算法空间复杂度 算法 算法 算法是指&#xff0c;解决问题或执行任务的一系列步骤、规则或指令的有序集合。它可以用来解决各…

搭建自己的pts性能测试平台--jmeter+influxdb+chronograf+grafana

不知道大家有没有使用过阿里的性能工具pts&#xff0c;详细的数据视图不要太香&#xff0c;唯一的缺点就是收费。那有没有类似的这种平台&#xff0c;让我们可以不花钱就体验相同的快感呢&#xff0c;答案是有的&#xff0c;下图中的平台就是这片文章看完操作完之后&#xff0c…

《Go专家编程(第2版)》书评

首先感谢官方的肯定&#xff0c;让我在【图书活动第四期】的活动中获得了《Go专家编程(第2版)》这本书&#xff0c;以下是从我的观点对这本书的书评 文章目录 前言书籍部分读者评价总结 前言 很高兴有机会写一篇关于《Go专家编程&#xff08;第2版&#xff09;》的书评。大致读…

用VBA打印出某列单元格的值

VBA是比较简单的编程语言&#xff0c;只要安装用microsoft office就可以用来调试代码&#xff0c;不用安装第三方工具&#xff0c;值得大家抽空学一学。如果有Python编程的基础&#xff0c;学起来就非常的简单了。今天我们来学习一下如何用VBA打印出某列单元格的值。 比如&…

HNU-操作系统OS-实验Lab7

OS_Lab7_Experimental report 湖南大学信息科学与工程学院 计科 210X wolf (学号 202108010XXX) 实验目的 理解操作系统的同步互斥的设计实现;理解底层支撑技术:禁用中断、定时器、等待队列;在ucore中理解信号量(semaphore)机制的具体实现;理解管程机制,在ucore内…