2016-06-26 2 views
0

내가 뭘 잘못하고 있는지 알고 싶었습니다. 이것은 내 코드 샘플입니다. 함수 포인터를 사용하는 방법을 묘사 한 거친 코드 샘플입니다. 다음 예제에서 함수 포인터는 매개 변수를 사용합니다. 함수 포인터를 할당하는 동안 매개 변수가 이미 할당되었습니다. 이제는 함수 포인터를 호출하기 위해 여전히 함수 포인터를 제공해야합니다. 매개 변수 값은 사용되지 않습니다 (단, std :: placeholder를 사용하지 않는 한). 내 질문은 매개 변수를 필요로하고 매개 변수를 전달하지 않고 매개 변수가 이미 할당 된 함수 포인터를 호출하는 방법입니다.placeholder가 코딩되어 있지 않으면 std :: function에 매개 변수가 필요합니다.

#include <iostream> 
#include <functional> 

using namespace std; 

std::function<std::string(std::string)> fptr; 

std::string foo() 
{ 
    return fptr(); //--->statement A - I need to invoke this funct ptr without passing a parameter as a parameter has already been assigned in statement B 
} 

std::string bar(std::string p) 
{ 
    return p; 
} 

int main() 
{ 
    fptr = std::bind(&bar,"Hello"); --->statement B 
    std::cout << foo(); 
} 

내가 "안녕하세요"기능 bar에 매개 변수를 어떤 자리 표시자를 사용하지 않고 std::bind에주의. 제 질문은 왜입니까

return fptr(); 

작동하지 않습니다. 내가 다음과 같이하면

return fptr("Bye"); 

"Hello"를 반환합니다. (fptr 호출 중에 매개 변수 전달 지점 없음) 매개 변수없이 작동하지 않는 이유는 무엇입니까?

답변

3

결과로 std::bind을 사용하면 필요한 것보다 많은 인수를 전달하고 이러한 추가 인수를 무시할 수 있습니다. 귀하의 경우 std::bind(&bar, "Hello")은 인수없이 호출되거나 fptr에 의해 선언되고 하나는 std::string 인수로 호출 될 수 있습니다.

문제의 해결책은 간단합니다. fptr의 유형을 std::function<std::string()>으로 변경하십시오.이 인수는 인수를 허용하지 않고 문자열을 반환합니다.