C++ 如何在私有中定义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

我想将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;
}

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);
        }
    };