张大帅哥_ 2022-08-19 15:48 采纳率: 63.6%
浏览 51
已结题

C++ Lambda表达式的类型是什么

问题描述

我的一个类的接口中需要传入一个回调函数,我想在这个回调函数中捕获外部变量,

但是这个类是我自己写的库,而这个外部变量并不是这个接口必要的参数,所以不能直接把外部变量传入接口中,

所以我想这个回调函数传入个lambda表达式,在lambda表达式中捕获外部变量,

请问在函数的参数列表中怎么声明这个回调函数的类型?

Lambda表达式类型的实验

如果我使用auto,当我把鼠标移到变量名上面时,看不出变量的类型:

img

它显示的类型是 (lambda at ***.cpp:353:14)

如果使用声明函数指针的方式声明lambda表达式,并不会报错

int (*callback)() = [] () { return 0; };

当我在Lambda表达式中捕获外部变量时就会报错:

int index = 0;
int (*callback)() = [index] () { return index; };

报错信息:

mainwindow.cpp:353:11: error: no viable conversion from '(lambda at ***/mainwindow.cpp:353:18)' to 'int (*)()'

img

可是我在回调函数中要使用外部变量。

问题

请问在函数参数列表中如何声明该回调函数的类型?
或者有什么其他的解决方式?

  • 写回答

5条回答 默认 最新

  • sdghchj 2022-08-19 16:19
    关注

    lambda是一种匿名函数类型。
    没有捕获时,它会被处理成普通函数,所以隐式转换成函数指针。
    有捕获时,它会被处理成匿名类对象成员方法,所以不能隐式转换成函数指针。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 8月27日
  • 已采纳回答 8月19日
  • 创建了问题 8月19日