定义int->int
通过引用接收lambda参数的函数的正确方法是什么?
void f(std::function< int(int) >& lambda);
要么
void f(auto& lambda);
我不确定最后一种形式是否为合法语法。
还有其他方法可以定义lambda参数吗?
Answers:
您不能有auto
参数。您基本上有两个选择:
选项1:std::function
按照您的显示使用。
选项#2:使用模板参数:
template<typename F>
void f(F &lambda) { /* ... */}
在某些情况下,选项#2可能更有效,因为它可以避免为嵌入式lambda函数对象分配潜在的堆,但是只有当f
可以将其作为模板函数放在标头中时才有可能。与任何模板一样,它也可能增加编译时间和I-cache占用空间。请注意,它可能也没有效果,因为lambda函数对象足够小,可以在std::function
对象中内联表示。
std::function
包装器),从而提高了I-cache占用空间
std::function
对象中内联表示” ,这会引起误解。Lambda始终可用于内联(编译器可以选择不这样做)。 std::function
实现通常使用小对象优化来避免堆分配。如果lambda的捕获列表足够小,它将被存储在其中std::function
而不使用堆。除此之外,lambda的大小没有实际意义。
&
在void f(F & lambda)
?
我将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
}
输出:
500
1000
100
我知道已经有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;});
}
哪个输出:
foo
lambda 1
无需模板或std :: function
std::function
情况相同),而模板化版本则没有此限制。
const&
?