它有什么方法可以将 lambda 与捕获的参数存储在指针中

Seb*_* R. 1 c++ lambda

我对 lambdas 有一个问题,我想将它们保存在指针中,但不使用常量变量创建它们。

// Example program
#include <iostream>
#include <string>

template<short n>
void speak(){
    std::cout << "speak:[" << n << "]" << std::endl;
}

int main()
{
    typedef void(*func)(void);

    func ptr[8];
    const short j = 10;
    
    for(short i = 0; i < 4; i++){
       ptr[i] = [=](void)->void{
            std::cout << "lamda:[" << j << "]" << std::endl;
            };
        /*ptr[i] = [=](void)->void{
            std::cout << "lamda:[" << i << "]" << std::endl;
            };*/
        ptr[i + 4] = speak<j>;
        //ptr[i + 4] = speak<i>;
    }
    
    for(short i = 0; i < 8; i++){
        ptr[i]();
    }
    
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

可以使用常量 var "j" 定义 lambda,但不能使用 "i" 定义。有没有办法使用 i 来做到这一点,所以不需要这样做:

ptr[0] = [=](void)->void{
            std::cout << "lamda:[" << 0 << "]" << std::endl;
            };
ptr[1] = [=](void)->void{
            std::cout << "lamda:[" << 1 << "]" << std::endl;
            };
ptr[2] = [=](void)->void{
            std::cout << "lamda:[" << 2 << "]" << std::endl;
            };
ptr[3] = [=](void)->void{
            std::cout << "lamda:[" << 3 << "]" << std::endl;
            };
Run Code Online (Sandbox Code Playgroud)

模板化函数是我实现它的另一个尝试,但没有成功

当我尝试使用“i”时得到:“错误:无法在赋值中将'main()::<lambda()>' 转换为 'func {aka void ( )()}'”*

use*_*751 5

您使用std::function而不是指针。只需包含标题<functional>,然后更改

typedef void(*func)(void);
Run Code Online (Sandbox Code Playgroud)

typedef std::function<void(void)> func;
Run Code Online (Sandbox Code Playgroud)

一切都应该有效!

不知道为什么你也喜欢(void)()工作时写作。

不能使用函数指针的原因是因为函数指针只是指向代码;它没有任何捕获的变量。std::function是一个类,它也能够保存捕获的变量。