我想使用lambda作为C ++函数的参数,但我不知道在函数声明中指定哪种类型。我想做的是:
void myFunction(WhatToPutHere lambda){
//some things
}
我尝试了void myFunction(auto lambda)
和void myFunction(void lambda)
但这些代码都没有编译过。如果重要,lambda不会返回任何内容。
如何在lambin C ++函数中使用lambda作为参数?
答案 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<>
对象并通过参考传递。