如何私下定义 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;
如果我不将 lambdaFunc
与 for_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 函数?的主要内容,如果未能解决你的问题,请参考以下文章
如何在自定义授权方 AWS lambda 函数中访问 http 标头
[二] java8 函数式接口详解 函数接口详解 lambda表达式 匿名函数 方法引用使用含义 函数式接口实例 如何定义函数式接口