Header 嵌套 C++ lambda 函数

Header for nested C++ lambda function

考虑以下(简化的)示例,其中两个 lambda 函数相互调用,其中一个函数还将另一个函数作为参数。我需要使用 lambda 函数,因为这些函数还在彼此之间传递经过修改的嵌套函数。

#include <iostream>
using namespace std;

auto f = [](int n, auto h)
{
    if(n >= 5) return n;
    cout << "h is some function " << h(4.0) << end; 
    auto func = [](int m){ return m*h(m); }; // some nested function   
    return g(n+1,func);  
};

auto g = [](int n, auto h)
{
    if(n >= 5) return n;
    cout << "h is some function " << h(5.0) << end; 
    auto func = [](int m){ return m*h(m); }; // some nested function   
    return f(n+1,func); 
};

int main()
{
    auto initial_function = [](int m){ return m*m; };
    f(1, initial_function);
    return 0.0;
}

这 returns 通常的错误 未声明的标识符 'g' 这是预期的,因为没有 header 文件。所以我的问题是:声明这两个 lambda 函数的正确语法是什么?

您需要在 g 中捕获 lambda(反之亦然)。 gf 指向 一个(未命名)函数的变量。制作这些 lambda 没有任何意义。当您需要局部范围内的函数时,Lambda 最有效。您必须至少将其中一个转换为函数,并为其做一个前向声明才能使此代码正常工作

int f(int n);
auto g = [](int n)
{
     if(n >= 5) return n;
    return f(n+1); 
};

int f(int n)
{
    if(n >= 5) return n;
    return g(n+1);  
}

int main()
{
    f(1);
    return 0.0;
}

根据OP的编辑,OP可能需要的是

template<typename T1, typename T2>
auto g(int n, const T1& f, const T2& h)
{ 
    if(n >= 5) return n;
    cout << "h is some function " << h(5.0) << end; 
    return f(n+1); 
} 

被称为:

auto h = [](int m) { return m*m; };
auto f = [h](int m) { return n >= 5 ? n : return g(n+1, f, h); };
g(n, f, h);

使用 std::function 解决问题。

#include <functional>
#include <iostream>

std::function<int(int)> f;
std::function<int(int)> g;    

int main()
{

   f = [](int n)
   {
     if(n >= 5) return n;
     return g(n+1);  
   };

   g = [](int n)
   {
      if(n >= 5) return n;
      return f(n+1); 
   };

    std::cout << f(1) << std::endl;
    return 0;
}

lambda 的类型没有明确定义,因此没有直接的答案。我更喜欢@bashrc 的回答,但如果你坚持要有两个 lambda,这个变体可能会起作用:

extern int (*f)(int n);

auto g = [](int n)
{
    if (n >= 5) return n;
    return f(n + 1);
};

int (*f)(int n) = [](int n)
{
    if (n >= 5) return n;
    return g(n + 1);
};

int main()
{
    f(1);
    return 0;
}

这适用于我的机器:

#include <functional>
#include <iostream>
#include <stdio.h>
using namespace std;

extern function<int(int, function<int(int)>)> g;

auto f = [](int n, function<int(int)> h)
{
    if (n >= 5) return n;
    cout << "h is some function " << h(4.0) << endl;
    auto func = [h](int m) { return m*h(m); };   
    return g(n + 1, func);
};

function<int(int, function<int(int)>)> g = [](int n, function<int(int)> h)
{
    if (n >= 5) return n;
    cout << "h is some function " << h(5.0) << endl;
    auto func = [h](int m) { return m*h(m); };   
    return f(n + 1, func);
};

int main()
{
    auto initial_function = [](int m) { return m*m; };
    f(1, initial_function);

    getchar();
    return 0; // Return value of the function is int so its better to use 0 rather than 0.0
}