c++ 将函数转换为局部函数(lambda)

vvppvyoh  于 2023-01-22  发布在  其他
关注(0)|答案(2)|浏览(163)

我想把FindFirstKey1函数转换成一个叫做FindFirstKey2的lambda函数:
以下是我的尝试:

#include <vector>

struct Point
{
    int x;
    int y;
};

bool FindFirstKey1(std::vector<Point> &m, Point &FirstKeyFound, int currentKeyIndex, int SearchKey)
{
    if (currentKeyIndex < m.size())
    {
        auto key1 = m[currentKeyIndex];

        if (key1.x <= SearchKey)
        {
            FirstKeyFound = key1;
            return true;
        }
    }

    return false;
}

int main()
{
    std::vector <Point> m;
    Point FirstKeyFound;
    int currentKeyIndex;
    int SearchKey;

    bool FindFirstKey2 = [&m, &FirstKeyFound, currentKeyIndex, SearchKey]()
    {
        if (currentKeyIndex < m.size())
        {
            auto key1 = m[currentKeyIndex];

            if (key1.x <= SearchKey)
            {
                FirstKeyFound = key1;
                return true;
            }
        }

        return false;
    };

    FindFirstKey1(m, FirstKeyFound, currentKeyIndex, SearchKey);
    FindFirstKey2(m, FirstKeyFound, currentKeyIndex, SearchKey);
}

我仍然收到一些我不理解的错误:
错误C2440“初始化”:无法从“main::”转换<lambda_55baf115e13173580997f8ba93ea8513>为“bool”
我需要什么来使它工作,即调用lambda函数就像我调用正则函数一样?

wz1wpwve

wz1wpwve1#

您的代码有两个问题。
问题一:

bool FindFirstKey2 = [&m, &FirstKeyFound, currentKeyIndex, SearchKey]()

闭包的类型,或者说lambda,是一个匿名类。它不是一个bool,因此应该是:

auto FindFirstKey2 = [&m, &FirstKeyFound, currentKeyIndex, SearchKey]()

问题二:

FindFirstKey2(m, FirstKeyFound, currentKeyIndex, SearchKey);

FindFirstKey2是一个不带参数的闭包,见上面,你把它声明为一个闭包,或者lambda,它通过引用捕获四个对象,并且不带参数,但是在这里你调用它并传递给它四个参数。
无论如何,你都需要调和这种差异,要么你需要修改闭包以接受四个参数,要么在调用闭包时不给它传递任何参数。

f87krz0w

f87krz0w2#

如果要复制FindFirstKey1的功能,语法如下:

auto FindFirstKey2 = [](std::vector<Point> &m, Point &FirstKeyFound, int currentKeyIndex, int SearchKey) {
   // Here your code
};

相关问题