【发布时间】:2020-12-21 09:40:34
【问题描述】:
我知道之前有人问过这个问题,但他们都没有解决 c++20 lambdas。
我一直在研究 c++20 的新功能,其中一个引起我注意的是在未评估的上下文中使用 lambdas 的可能性。
我看到您可以在 Jason Turner 的视频中编写如下代码:
std::unique_ptr<int, decltype([] (FILE* f) {fclose(f);})>;
这表明std::unique_ptr 可以采用 lambda 参数。
所以我尝试实现一个类似惰性数学的序列类,如下所示:
#include <vector>
#include <iostream>
template <typename func, typename T>
struct Sequence
{
T operator[] (int i) {
return func(i);
}
};
int main() {
auto u = std::vector{1 , 2, 3, 4};
auto v= Sequence<decltype([u] (int i) {return u[i];}) , int>();
std::cout << v[1];
return 0;
}
这个想法是序列类被定义为一个从 N -> T 的函数(就像在数学中一样),并且我在编译时将此函数作为模板参数传递。 但是,我收到错误“没有匹配的 lambda 调用”。 怎么解决?
我可以在运行时将函数存储在 std::function 中,但我负担不起它带来的开销。
【问题讨论】:
-
提示:
func是 lambda 的类型,而不是 lambda 本身。要获取 lambda 本身,您需要将它传递到某个地方 -
@user202729 如果每个 lambda 具有不同的类型,我不能调用 lambda 吗?另外,如果我不能,Jason Turner 的 std::unique_ptr 示例如何工作?它肯定会调用 lambda 吗?
-
Lambda 可以从
c++20中的类型默认构造。但是你不能默认构造一个捕获 lambda。 -
@super 如果我传入一个非捕获的 lambda,我仍然会得到同样的错误,即 [] (int i) {return i;}
-
那是因为你试图调用类型,而不是创建一个 lambda 实例并调用它。看看here。