gpt4 book ai didi

c++ - 接受并返回 lambda(锁包装器)

转载 作者:行者123 更新时间:2023-12-05 01:52:42 27 4
gpt4 key购买 nike

我想接受任何 lambda,以便它可以在 lock_guard 下安全地执行一些操作,然后返回任何内容,但是如下所示使用会引发错误:

#include <iostream>
#include <functional>
#include <mutex>
#include <memory>

class Test {
public:
template<typename Ret>
Ret DoLocked(std::function<Ret(Test&)> func) {
std::lock_guard<std::mutex> lock(*mtx);
return func(*this);
}
private:
std::unique_ptr<std::mutex> mtx = std::make_unique<std::mutex>();
};

int main() {
Test a;
a.DoLocked([](Test &s) {
std::cout << "in do locked" << std::endl;
});

return 0;
}
[build] /some-path/test.cc:21:6: error: no matching function for call to ‘Test::DoLocked(main()::<lambda(Test&)>)’
[build] 21 | });
[build] | ^
[build] /some-path/test.cc:9:13: note: candidate: ‘template<class Ret> Ret Test::DoLocked(std::function<Ret(Test&)>)’
[build] 9 | Ret DoLocked(std::function<Ret(Test&)> func) {
[build] | ^~~~~~~~
[build] /some-path/test.cc:9:13: note: template argument deduction/substitution failed:
[build] /some-path/test.cc:21:6: note: ‘main()::<lambda(Test&)>’ is not derived from ‘std::function<Ret(Test&)>’
[build] 21 | });```

最佳答案

这很容易通过摆脱 std::function 并使函数参数成为模板参数来解决。看起来像

template<typename Func>
auto DoLocked(Func func) -> decltype(func(*this)) {
std::lock_guard<std::mutex> lock(*mtx);
return func(*this);
}

它不适用于 std::function 的原因是 lambda 表达式不会创建 std::function。它创建一个未命名类类型的对象,该对象具有用 lambda 表达式的主体定义的 operator()。因此,模板推导失败,因为它需要一个 std::function 但这不是所提供的。

关于c++ - 接受并返回 lambda(锁包装器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71517035/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com