如何在C++11中使用lambda函数?[副本]

rdlzhqv9  于 2023-06-07  发布在  其他
关注(0)|答案(1)|浏览(169)

此问题已在此处有答案

Conversion of lambda expression to function pointer(1个答案)
13小时前关闭
我有一个对象,它需要一个函数传递给它才能工作。就像

int doSomething(string a, int b, string(*lookUpFunction)(string a, int b)) {
    return lookUpFunction(a,b).length():
}

这被简化为仅包括所需的参数和正确的返回类型。我相信我的定义是正确的,但如果我错了,请纠正我。lookUpFunction接受一个字符串和一个int并返回一个字符串。
我的问题是使用这个功能。我想我会这样用

class x {
    DataBase* db;
public:
    int myFunc();
}

int x::myFunc() {
    return doSomething("a",1,[this](string a, int b)->string {
        return db->someFuncThatTakesStringAndInt(a,b);
    });
}

但是我的IDE抛出错误。如果我删除“this”,它会说db不可访问。它表示lambda函数不能被转换为正确的格式。

kcugc4gi

kcugc4gi1#

您的doSomething()函数正在为其lookUpFunction回调接收一个普通的C风格函数指针。
但是,capturing lambda不能转换为函数指针,只有 non-capturing lambda才是可转换的。您正在捕获this,这就是为什么您不能如图所示传入lambda。
你的doSomething()函数需要接受一个回调对象作为std::function或模板参数,而不是一个函数指针,例如:

int doSomething(string a, int b, std::function<string(string, int)> lookUpFunction) {
    return lookUpFunction(a,b).length():
}
template<typename Callable>
int doSomething(string a, int b, Callable lookUpFunction) {
    return lookUpFunction(a,b).length():
}

现在,您可以将 capturing lambda传递给其中任何一个。

相关问题