如何传递使用lambda的函数?

时间:2013-10-08 07:47:10

标签: c++ lambda

我是这样做的,但它不起作用

#include <iostream>
using namespace std;

typedef int(*func)(int,int);

void test(func fun, int k, int b)
{
    int result = fun(k, b);
    cout << "result: " << result;
}

int main()
{
    test([](int k, int b){ return k*2 + b},2,3);
}

我该怎么办才能让它发挥作用?

此问题已解决:

此问题无法将'anonymous-namespace'::转换为'func',请按照Joachim的建议,使用std::function可以修复它。

这是固定代码:

#include <iostream>
#include <functional>
using namespace std;

int test(std::function<int (int,int)> fun, int k, int b)
{
    return fun(k, b);
}

int main()
{
    int result = test(
        [](int k, int b)
        { 
            return k*2 + b;
        },2,3);
    cout << "result: " << result;
    return 0;
}

5 个答案:

答案 0 :(得分:3)

您遇到语法错误:

 test([](int k, int b){ return k*2 + b },2,3);
                                   //^ here you missed semicolon!

上面的代码错过了注释中指示的分号。

这里纠正了:

 test([](int k, int b){ return k*2 + b; },2,3);
                                   // ^ corrected!

希望有所帮助。

答案 1 :(得分:2)

std::function

怎么样?
using func_t = std::function<int(int, int)>;

void test(func_t fun, int k, int b)
{
    ...
}

或只是模板:

template<typename F>
void test(F fun, int k, int b)
{
    ...
}

答案 2 :(得分:2)

首先,您应该在编译器中启用C++11标准。使用GCC 4.8,使用g++ -std=c++11 -Wall -g进行编译。

然后你应该声明

void test(std::function<int(int,int)>fun, int k, int b)

lambda构造返回的closure(即std::function不是指向函数的指针(因为它混合了代码和封闭数据)。

最后,不要忘记lambda返回时的分号,其他人回答

 test([](int k, int b){ return k*2 + b;},2,3);

答案 3 :(得分:2)

在lambda中为return语句留下一个分号。

int main()
{
    test([](int k, int b){ return k*2 + b;},2,3);
}

答案 4 :(得分:0)

您不应该在测试函数中使用函数指针,而是使用std :: function类型:

typedef std::function<void (int, int)> func;

void test(func fun, int k, int b) {/*Same as before*/}