是否有一个std :: function类型或类似的lambda与auto参数?

lee*_*mes 6 c++ lambda auto generic-lambda c++14

当我将lambda分配给显式类型变量时(例如,当它是递归的时,为了捕获函数本身),我使用std::function.

以这个愚蠢的"位计数"函数为例:

std::function<int(int)> f;
f = [&f](int x){ return x ? f(x/2)+1 : 0; };
Run Code Online (Sandbox Code Playgroud)

当我们使用auto参数进行泛化时x,如C++ 14泛型lambda中所介绍的情况怎么样?

std::function<int(???)> f;
f = [&f](auto x){ return x ? f(x/2)+1 : 0; };
Run Code Online (Sandbox Code Playgroud)

很显然,我不能把autofunction类型参数.

是否有可能通常定义一个仿函数类来覆盖上面的确切情况,但仍然使用lambda作为函数定义?

(不要过度概括这一点,只接受一个自动参数并对返回值进行硬编码.)用例适用于上述场景:通过引用为递归调用捕获函数本身.

Ben*_*ley 4

您可以创建一个通过将其作为参数传递给自身来调用自身的 lambda:

auto f = [](auto self, auto x) -> int {
    return x ? self(self, x / 2) + 1 : 0;
};

std::cout << f(f, 10);
Run Code Online (Sandbox Code Playgroud)

然后,您可以在另一个 lambda 中捕获该 lambda,因此您不必担心将其传递给自身:

auto f2 = [&f](auto x) {
    return f(f, x);
};

std::cout << f2(10);
Run Code Online (Sandbox Code Playgroud)