[英]Lambdas and passing a pointer class as argument
我在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(); });
我得到的錯誤:
錯誤:無法將參數'1'的'list_prescriptions_by_doctor()::'轉換為'cb_prescription {aka void( )(Prescription *)}'到'void loop_prescriptions(cb_prescription,bool)'}); *
有誰知道我如何錯誤地使用參數? 我試圖將指針的引用添加為*&,並且只是刪除了指針,但是List類(是的,我必須使用它)返回一個類指針,所以我不能簡單地使用副本。
謝謝你的幫助!
更新我已經根據答案更新了pastebin,從而提供了可行的解決方案。 http://pastebin.com/7yTPGEQx
您傳遞lambda(或任何隨機類)時,您的函數僅接受函數指針。 由於類不是函數指針,因此很可能希望接受函子(例如,所有類似函數的東西)
我想您可以通過2種不同的方式更改代碼:
// 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獲得開銷。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.