lur*_*her 69 c++ lambda function-parameter function-prototypes c++11
定义int->int通过引用接收lambda参数的函数的正确方法是什么?
void f(std::function< int(int) >& lambda);
Run Code Online (Sandbox Code Playgroud)
要么
void f(auto& lambda);
Run Code Online (Sandbox Code Playgroud)
我不确定最后一种形式是否是合法的语法.
还有其他方法来定义lambda参数吗?
bdo*_*lan 74
你不能有auto参数.你基本上有两个选择:
选项#1:std::function按照您的使用进行操作.
选项#2:使用模板参数:
template<typename F>
void f(F &lambda) { /* ... */}
Run Code Online (Sandbox Code Playgroud)
在某些情况下,选项#2可能更有效,因为它可以避免嵌入式lambda函数对象的潜在堆分配,但只有在f可以作为模板函数放置在头中时才可能.与任何模板一样,它也可能会增加编译时间和I-cache占用空间.请注意,它也可能没有效果,就好像lambda函数对象足够小,它可以在std::function对象中内联表示.
Naw*_*waz 34
我会template用作:
template<typename Functor>
void f(Functor functor)
{
cout << functor(10) << endl;
}
int g(int x)
{
return x * x;
}
int main()
{
auto lambda = [] (int x) { cout << x * 50 << endl; return x * 100; };
f(lambda); //pass lambda
f(g); //pass function
}
Run Code Online (Sandbox Code Playgroud)
输出:
500
1000
100
Run Code Online (Sandbox Code Playgroud)
演示:http://www.ideone.com/EayVq
Pud*_*dle 25
我知道已经 7 年了,但这是其他人没有提到的一种方式:
void foo(void (*f)(int)){
std::cout<<"foo"<<std::endl;
f(1); // calls lambda which takes an int and returns void
}
int main(){
foo([](int a){std::cout<<"lambda "<<a<<std::endl;});
}
Run Code Online (Sandbox Code Playgroud)
哪些输出:
foo
lambda 1
Run Code Online (Sandbox Code Playgroud)
不需要模板或 std::function
Ale*_*nov 12
从 C++ 20 开始,
void f(auto& lambda);
Run Code Online (Sandbox Code Playgroud)
实际上有效(这是一个缩写的函数模板):
当占位符类型( 或
auto)Concept auto出现在函数声明或函数模板声明的参数列表中时,该声明声明了一个函数模板,并且为每个占位符发明了一个模板参数,并将其附加到模板参数列表中
它完全相当于 @bdonlan 答案中的选项 2:
template<typename F>
void f(F &lambda) { /* ... */}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
64146 次 |
| 最近记录: |