簡體   English   中英

C++ 傳遞 lambda 作為 function 參數和參數列表

[英]C++ Passing lambda as function parameter with argument list

目前,我正在嘗試在 class 中構建類似 Java 的 forEach ,在其中我通過 lambda 並為每個項目調用它。 目前我已經像這樣實現它:

Foo.h

class Foo
{
public:
    Foo();
    void forEach(void(*lambda)(Bar*));
private:
    SpecialList mElements;
};

Foo.cpp

#include "Foo.h"

void Foo::forEach(void(*lambda)(Bar*))
{
    for (auto& v : mElements)
    {
        // Try/catch for stopping
        try {lambda(&v.second);}
        catch (int) {break;}
    }
}

主文件

int main() {
    Foo foo();
    foo.forEach([](Bar* bar) {
        std::cout << bar->something() << std::endl;
    });
    return 0;
}

它工作得很好,但我希望能夠通過引用將元素傳遞到 lambda 以便能夠在以后使用,如下例所示:

主文件

int main() {
    Foo foo();
    foo.forEach([&var1](Bar* bar) {
        std::cout << var1 << bar->something() << std::endl;
    });
    return 0;
}

我們怎樣才能實現這樣的目標? 我一直在嘗試,但它給出了錯誤no proper conversion function from... to...並嘗試搜索以前的問題並查看 std::for_each 之類的函數如何工作,但無法做出頭或腳。 謝謝。

lambda 不是 function 指針。 如果它沒有捕獲的對象,它可以隱式轉換為一個,否則它不能。

一個 lambda 有一個匿名類型,所以如果要直接使用該類型,則需要使用模板:

template<typename Callable>
void Foo::forEach(Callable lambda)
{
    for (auto& v : mElements)
    {
        // Try/catch for stopping
        try {lambda(&v.second);}
        catch (int) {break;}
    }
}

否則, lambda 始終可以轉換為std::function (即使您捕獲對象),因此您可以這樣編寫:

void Foo::forEach(std::function<void(Bar*)> lambda)
{
    for (auto& v : mElements)
    {
        // Try/catch for stopping
        try {lambda(&v.second);}
        catch (int) {break;}
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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