如何私下定义 lambda 函数?

Posted

技术标签:

【中文标题】如何私下定义 lambda 函数?【英文标题】:How to define lambda function in private? 【发布时间】:2019-07-22 15:23:17 【问题描述】:

我想将 lambda 函数的详细信息隐藏到类的 private 部分中。

我试图将 lambda 函数部分与 for_each() 函数分开。

#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;

class Sol 

private:
    vector<int> vec = vector<int> 1,2,3,4,5 ;
    int target = 10;
    auto lambdaFunc = [=](int& v)  v += target; ;

public:
    void addConst() 
        for_each(vec.begin(), vec.end(), lambdaFunc);
    

    void printVec() 
        for_each(vec.begin(), vec.end(), [](int v) cout << v << endl; );
    
;

int main() 

    Sol sol;
    sol.addConst();
    sol.printVec();
    return 0;

如果我不将 lambdaFuncfor_each() 函数分开,我会打印出向量的元素。 但是,通过分隔lambdaFunc,我收到了错误消息:

error: non-static data member declared 'auto'

auto 更改为static auto 没有解决。

【问题讨论】:

你为什么要这样做? “如果我不将 lambdaFunc 与 for_each() 函数分开,我会打印出向量的元素?”是什么意思? 像你一样使用 lambda 简直是滥用!如果您想定义但不同时使用它,您应该始终编写一个可以是私有的标准(成员)函数。定义“自动 lambda... 类型”没有任何帮助。 @ArdaAytekin 他们的意思是代码按预期编译和工作。 target 应该保持不变吗? 【参考方案1】:

如果您可以访问c++17 编译器,最好的选择是提供一个private 成员函数,如他的答案中所示的@VittorioRomeo(这是更直接的IMO)。


c++11解决方案!

另一种方法是为 lambda 提供类型。你可以

    要么使用 std::function 和一些类型擦除成本来定义 lambda 的类型。

    (See Live)

    std::function<void(int&)> lambdaFunc = [=](int& v)  v += target; ;
    

    或者,如果 lambda 可以更改为捕获更少的一个,则可以存储 进入如下类型的函数指针。其中target 将 作为 lambda 的第二个参数传递 无捕获。但这也需要更改addConst() 功能。

    (See Live)

    class Sol 
    
    private:
        std::vector<int> vec 1,2,3,4,5 ;
        //                  ^^^^^^^^^^^^^^ ->  can use just braced-init-list
        int target 10 ;
        void(*lambdaFunc)(int&, int) = [](int& v, int tar)  v += tar; ;
        //^^^^^^^^^^^^^^^^^^^^^^^^^ // fun-pointer type
    
    public:
        void addConst()
        
            for (auto& element : vec) lambdaFunc(element, target);
        
    ;
    

【讨论】:

【参考方案2】:

不确定您为什么要这样做。如果你真的有正当理由,你可以改用private 成员函数:

class Sol
private:
    auto lambdaFunc()  return [=](int& v)  v += target; ; 

public:
    void addConst() 
        for_each(vec.begin(), vec.end(), lambdaFunc());
    
;

【讨论】:

我会称它为 getLambdaFunc 之类的东西,因为函数的高阶性质可能不会立即明显,否则...... 在 c++17 之前你不会使用那种自动返回类型! @GemTaylor:我错过了什么吗?为什么不是 C++14? 可能是 14,但无论如何都不是 11

以上是关于如何私下定义 lambda 函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何定义一个以捕获为参数的 lambda 的函数?

如何在循环中用lambda函数定义一个非常量函数列表?

如何在自定义授权方 AWS lambda 函数中访问 http 标头

Python lambda函数

[二] java8 函数式接口详解 函数接口详解 lambda表达式 匿名函数 方法引用使用含义 函数式接口实例 如何定义函数式接口

如何用Keras自定义层?