在声明它的同一行中调用C++递归lambda

NoS*_*tAl 17 c++ recursion lambda c++11

这主要是一种单线型问题,出于可读性原因,我通常会将这些代码写成多行.

所以我的问题是我可以在定义它的同一语句中调用递归lambda吗?

所以不是这样的:

int n=3;
function<void(int)> f {[n,&f](int i){if (i>1) { cout << "func(a, "; f(i-1); cout << ")";} else cout << "a";}};
f(n);
Run Code Online (Sandbox Code Playgroud)

n在定义f的同一行中调用该函数.

Jar*_*d42 14

在一个声明几个变量的声明中;-)
主要不是你想要的:

std::function<void(int)>
    f {[&f](int i){
        if (i>1) {
            std::cout << "func(a, "; f(i-1); std::cout << ")";}
        else
            std::cout << "a";
    }},
    dummy((f(3), nullptr));
Run Code Online (Sandbox Code Playgroud)

演示

  • 困惑的人在这里问这个答案:[dummy()函数 - 应该是什么?](http://stackoverflow.com/questions/42805379/dummy-function-what-is-that-supposed-to-be ) (5认同)

cma*_*ter 6

事实上,你可以.这是一个完整的例子,编译和运行良好g++ -std=c++11:

#include <iostream>
#include <functional>

int main() {
    std::function<int(int)> f = ([&f](int i){ return i?f(i-1)*i:1; }), trash = (std::cout << f(3) << std::endl, f);
}
Run Code Online (Sandbox Code Playgroud)

但是,我认为实际使用它并不是一个好主意:该构造, trash = (..., f)将用于代码高尔夫或模糊编程竞赛,但不符合我的生产代码标准.


Com*_*sMS 6

让我一瞥函数式编程世界,人们通常使用组合器来处理递归的lambdas.去年有一项提案(P0200r0)将一个简单的Y-combinator添加到标准库中.

抛开这样做是否是个好主意的问题,这将允许你编写和调用这样的递归lambda:

y_combinator([](auto self, int i){
    if (i>1) {
        std::cout << "func(a, ";
        self(i-1);
        std::cout << ")";
    } else {
        std::cout << "a";
    }
})(6);
Run Code Online (Sandbox Code Playgroud)

这里的基本思想是y-combinator是一个高阶函数,它包含一个lambda,它作为第一个参数传递给'本身'.组合器负责将自变量包装为lambda的所有调用.

你可以在coliru尝试一下.

  • [该提案被拒绝](https://issues.isocpp.org/show_bug.cgi?id=157). (3认同)