我在使用lambda时遇到问题,我想将它们保存在指针中,但不使用常量变量来创建它们。
// 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;
}
可以使用常量var“ j”定义lambda,但不能使用“ i”定义lambda。有没有办法使用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;
};
模板化函数是我实现它的另一种尝试,但没有成功
当我尝试使用“ i”时得到:“错误:无法在分配中将'main()::
答案 0 :(得分:4)
您使用std::function
代替指针。只需添加标题<functional>
,然后更改
typedef void(*func)(void);
到
typedef std::function<void(void)> func;
一切都会正常!
不确定(void)
也能工作时为什么喜欢写()
。
之所以不能使用函数指针,是因为函数指针仅指向代码。它没有任何捕获的变量。 std::function
是一个类,也可以容纳捕获的变量。