[英]C++ Passing lambda as function parameter with argument list
目前,我正在嘗試在 class 中構建類似 Java 的 forEach ,在其中我通過 lambda 並為每個項目調用它。 目前我已經像這樣實現它:
class Foo
{
public:
Foo();
void forEach(void(*lambda)(Bar*));
private:
SpecialList mElements;
};
#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.