使用lambda作为C ++函数的参数

时间:2016-11-28 12:40:57

标签: c++ function c++11 lambda

我想使用lambda作为C ++函数的参数,但我不知道在函数声明中指定哪种类型。我想做的是:

void myFunction(WhatToPutHere lambda){
    //some things
}

我尝试了void myFunction(auto lambda)void myFunction(void lambda)但这些代码都没有编译过。如果重要,lambda不会返回任何内容。

如何在lambin C ++函数中使用lambda作为参数?

4 个答案:

答案 0 :(得分:17)

您有两种方法:制作功能模板:

template <typename F>
void myFunction(F&& lambda){
    //some things
}

或使用std::function

删除类型
void myFunction(const std::function<void()/* type of your lamdba::operator()*/>& f){
    //some things
}

答案 1 :(得分:13)

基本上你有两种选择。

将其设为模板:

template<typename T>
void myFunction(T&& lambda){
}

或者,如果您不想(或不能)这样做,您可以使用类型删除std::function

void myFunction(std::function<void()> const& lambda){
}

相反,您使用auto的尝试在目前在gcc中实施的TS概念下是正确的,其中它是abbreviated template

// hypothetical C++2x code
void myFunction(auto&& lambda){
}

或概念:

// hypothetical C++2x code
void myFunction(Callable&& lambda){
}

答案 2 :(得分:1)

像传递简单函数一样传递它。只需使用 auto

为其命名
#include <iostream>

int SimpleFunc(int x) { return x + 100; }
int UsingFunc(int x, int(*ptr)(int)) { return ptr(x); }
auto lambda = [](int jo) { return jo + 10; };

int main() {
    std::cout << "Simple function passed by a pointer: " << UsingFunc(5, SimpleFunc) << std::endl;
    std::cout << "Lambda function passed by a pointer: " << UsingFunc(5, lambda) << std::endl;

}

输出:
通过指针传递的简单函数:105
指针传递的Lambda函数:15

答案 3 :(得分:0)

如果这是inline函数,则更喜欢模板,如

template<typename Func>
void myFunction(Func const&lambda)
{
    //some things
}

因为它绑定到任何有意义的东西(并且会导致其他任何东西的编译器错误),包括lambdas,命名类的实例和std::function<>个对象。

另一方面,如果此函数不是inline,即在某个编译单元中实现,则不能使用通用模板,但必须使用指定的类型,最好采用std::function<>对象并通过参考传递。