【发布时间】:2016-06-28 06:03:12
【问题描述】:
我在将类指针作为参数传递给 lambdas 回调时遇到问题。
粘贴箱:http://pastebin.com/SqXHtGDt
我如何定义回调:
typedef void (*cb_prescription)(Prescription * prescription);
我如何使用回调:
void loop_prescriptions (cb_prescription callback, bool add = true)
{
for (int i = 1; i <= prescriptions->noOfElements(); i++) {
Prescription * prescription = (Prescription *) prescriptions->removeNo(i);
if (add) {
prescriptions->add(prescription);
}
callback(prescription);
}
}
我知道一切正常,除了参数指针部分。
loop_prescriptions ([&] (Prescription * paper) { paper->something(); });
我得到的错误:
错误:无法将“list_prescriptions_by_doctor()::”转换为“cb_prescription {aka void ()(Prescription*)}”,以将参数“1”转换为“void loop_prescriptions(cb_prescription, bool)” });*
有人知道我是如何错误地使用参数的吗? 我尝试将指针的引用添加为 *&,然后删除指针,但是 List 类(是的,我必须使用它)返回一个类指针,所以我不能简单地使用副本。
感谢您的帮助!
更新 我已经根据答案更新了我的 pastebin,它提供了一个可行的解决方案。 http://pastebin.com/7yTPGEQx
【问题讨论】:
-
您不能将有状态的 lambda(捕获任何内容)转换为函数指针。这就是错误所说的。要么不使用(非全局)状态,要么修改
loop_prescriptions签名。 -
所以我需要事先将我需要的任何参数传递到 lambda 范围内?
-
不,如果你打算使用你的回调类型和所有使用该回调类型的类,你必须使用无上下文的 lambdas。或者,如果您需要该上下文,则需要相应地更改回调类型。
-
是否可以使用两个 lambda?一个是我定义 char 指针名称(作为配置 lambda),另一个是我将处理处方的 lambda? pastebin.com/PF8AZgrp
标签: c++ class pointers c++11 lambda