首页 > 解决方案 > 通过 lambda 函数转发附加参数

问题描述

这是最小的可重现代码,

#include <iostream>
#include <string>

void bar(std::string s, int x){        
    std::cout <<std::endl<< __FUNCTION__<<":"<<s<<" "<<x;
}

using f_ptr = void(*)(std::string);


void foo(f_ptr ptr){        
    ptr("Hello world");
}


template<typename T> void fun(T f){
        static int x;
        std::cout <<std::endl<<x++<<std::endl;
        f("Hello World");
}

int main()
{    
    //case:1
    f_ptr ptr1 = [](std::string s){bar(s,10);}; 
   // foo(ptr1);
    
    //case:2
    static int x =10;
    f_ptr ptr2 = [x](std::string s){bar(s,x);}; 
    //foo(ptr2); 
    
    
    //case:3
    int y =10;
    f_ptr ptr3 = [y](std::string s){bar(s,y);}; /* error*/
    foo(ptr3); 
    
    //case:4
    int z = 12;
    fun([z](std::string s){bar(s,z);});
    
    return 0;
}

错误:

main.cpp:25:50: error: cannot convert ‘main()::’ to ‘f_ptr {aka void (*)(std::basic_string)}’ in initialization
         f_ptr ptr3 = [y](std::string s){bar(s,y);}; /* error*/

我的问题是,

  1. 有没有办法case:3通过 lambda 转发其他参数?
  2. 什么转换导致错误case:3
  3. case:4typename T推导出什么?

标签: c++c++11lambda

解决方案


  1. 有没有办法case:3通过 lambda 转发其他参数?
  2. 什么转换导致错误case:3

带有捕获列表的 Lambda 不能隐式转换为函数指针;没有捕获的 lambdas 可以。你可以std::function改用,

void foo(std::function<void(std::string)> f){        
    f("Hello world");
}

或者像这样fun做一样直接采用 lambda。

  1. case:4typename T推导出什么?

该类型将是唯一的闭包类型;lambda 表达式是该类型的纯右值表达式。


推荐阅读