用于存储通用 lambda 的通用 std::function

Raj*_*esh 6 c++ lambda std-function generic-lambda c++14

当泛型 lambda 被存储为 a 时std::function,我们需要提供一个具体的类型,比如,

std::function<double(double)>
Run Code Online (Sandbox Code Playgroud)

因此绑定到特定类型,

以下声明:

std::function<auto(auto)>
Run Code Online (Sandbox Code Playgroud)

引发编译器错误。

我知道,从 c++14 开始,auto可用于存储 lambda 的返回值,但是在将 lambda 存储在std::function.

Pas*_* By 4

你不能。即使是定制的也没有std::function。这是类型擦除的基本限制。

直观上,模板需要函数调用时可用的类型信息,但类型擦除会std::function破坏该信息。

在更详细的层面上,类型擦除的工作原理是在编译时以与类型无关的方式存储操作集,或者通过虚拟函数隐式存储,或者通过函数指针显式存储。模板实际上是无限的操作族,因此不可能被存储。

如果您知道将使用的固定函数签名集,则可以编写自定义的std::function.