c++ - 嵌套 C++ lambda 函数的 header

标签 c++ c++11 lambda c++14 header-files

考虑以下(简化的)示例,其中两个 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;
}

这会返回常见的错误未声明的标识符'g',这是预期的,因为没有头文件。所以我的问题是:声明两个 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);

关于c++ - 嵌套 C++ lambda 函数的 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40734246/

相关文章:

c++ - 从文件读取并将值放入结构数组时遇到问题

c++ - 我怎样才能部分特化可变参数模板函数

c++ - 如何使用 std::move() 将 char[] 移动到 vector<char>

c++ - 不同大小数组的迭代器

php - 使类的静态成员成为函数(闭包)不起作用

Java 8 lambda 表达式 : Summing up method return values in a for each call for List/Set and Iterable

c++ - 临时对象可以绑定(bind)到非常量引用吗?

c++ - 如何在 main() 之前调试程序崩溃

c++ - 多维数组作为平面数组问题

c# - 为什么 Linq 不提供 lambda 参数而不是 IEqualityComparer<T>?