微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c ++ 0x:通过引用接收lambda作为参数的正确方法

如何解决c ++ 0x:通过引用接收lambda作为参数的正确方法

|| 定义通过引用接收“ 0” lambda参数的函数的正确方法是什么?
void f(std::function< int(int) >& lambda);
要么
void f(auto& lambda);
我不确定最后一种形式是否为合法语法。 还有其他方法可以定义lambda参数吗?     

解决方法

        您不能使用
auto
参数。您基本上有两个选择: 选项1:如图所示,使用ѭ4.。 选项2:使用模板参数:
template<typename F>
void f(F &lambda) { /* ... */}
在某些情况下,选项#2可能会更有效,因为它可以避免为嵌入式lambda函数对象分配潜在的堆,但是只有将“ 6”可以作为模板函数放在标头中时才有可能。与任何模板一样,它也可能增加编译时间和I-cache占用空间。请注意,它可能也没有作用,因为lambda函数对象足够小,可以在
std::function
对象中内联表示。     ,        我将
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
演示:http://www.ideone.com/EayVq     ,        我知道已经有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     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。