C++ 如何在私有中定义lambda函数?
我想将lambda函数的细节隐藏到类的C++ 如何在私有中定义lambda函数?,c++,class,c++11,lambda,class-members,c++17,C++,Class,C++11,Lambda,Class Members,C++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 t
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;
}
将
auto
更改为static auto
无法解决问题。不确定为什么要这样做。如果您确实有正当理由,可以使用private
成员函数:
class Sol{
private:
auto lambdaFunc() { return [=](int& v) { v += target; }; }
public:
void addConst() {
for_each(vec.begin(), vec.end(), lambdaFunc());
}
};
如果您可以访问编译器,最好的选择是提供一个private
成员函数,如@VittorioRomeo在他的回答中所示(这在我看来更直截了当)
解决方案 另一种方法是为lambda提供类型。你可以
std::function
来定义
lambda的类型
()
为什么要这样做?你说的“如果我不将lambdaFunc与for_each()函数分开,我会打印出向量的元素”是什么意思?像你这样使用lambda简直是滥用!如果您想定义但不同时使用它,您应该始终编写一个可以是私有的标准(成员)函数。定义“自动lambda…类型”没有任何帮助。@ArdaAytekin他们的意思是代码按照预期进行编译和工作。
target
应该是常量吗?我会将其称为getLambdaFunc
,因为函数的高阶性质可能不会立即明显,否则……直到c++17@杰姆·泰勒:我错过什么了吗?为什么不是C++14呢?也许是14,但无论如何不是11
class Sol{
private:
auto lambdaFunc() { return [=](int& v) { v += target; }; }
public:
void addConst() {
for_each(vec.begin(), vec.end(), lambdaFunc());
}
};
std::function<void(int&)> lambdaFunc = [=](int& v) { v += target; };
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);
}
};