簡體   English   中英

Lambda和將指針類作為參數傳遞

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM