Lambdas并将指针类作为参数传递

时间:2016-03-13 04:39:42

标签: c++ class pointers c++11 lambda

我在将一个类指针作为lambdas回调中的参数传递时遇到了问题。

pastebin: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)'      }); *

有谁知道我如何错误地使用参数? 我试图将指针的引用添加为*&amp;,只是删除指针,但List类(是的,我必须使用它)返回一个类指针,所以我不能简单地使用副本。

感谢您的帮助!

更新 我根据答案更新了我的pastebin,这提供了一个有效的解决方案。 http://pastebin.com/7yTPGEQx

1 个答案:

答案 0 :(得分:1)

当你传递一个lambda(或者换句话说,任何随机类)时,你的函数只接受函数指针。由于类不是函数指针,因此很可能希望接受仿函数(例如函数类似的所有东西)

我猜您可以通过两种不同的方式更改代码:

// Using a std::function object; which wraps both function pointers and classes with () operator
using cb_prescription = std::function<void(Prescription*)>;

template<typename cb_prescription>
void loop_prescriptions (cb_prescription &&callback, bool add = true)

第一个变体是我更喜欢的变体,因为这是非常通用的,不幸的是它包含回调的性能开销。除非您使用性能关键代码,否则我会使用此代码。

第二个变体通过模板工作,所以无论你传递到那里,可以用()运算符调用,匹配的参数都可以。但是,它要求所有呼叫者都可以使用此代码。由于模板,函数-ptr,lambda的确切类型是已知的,因此您不会从std :: function获得开销。