나는 람다에 문제가 있으며 포인터에 저장하고 싶지만 상수 변수를 사용하지 않고 만듭니다.
// 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"로 람다를 정의 할 수 있지만 "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;
};
템플릿 함수는 성공하지 못한 나의 다른 시도였습니다.
"i"사용을 시도했을 때 "오류 : 할당에서 'main () :: <lambda ()>'를 'func {aka void ( ) ()}' 로 변환 할 수 없습니다. "*
std::function
포인터 대신 사용 합니다. 헤더를 포함 <functional>
하고 변경하십시오.
typedef void(*func)(void);
...에
typedef std::function<void(void)> func;
모든 것이 작동합니다!
일할 (void)
때 왜 글을 쓰는지 잘 모르겠습니다 ()
.
함수 포인터를 사용할 수없는 이유는 함수 포인터가 코드를 가리 키기 때문입니다. 캡처 된 변수가 없습니다. std::function
캡처 된 변수를 보유 할 수도있는 클래스입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다