2013-08-12 4 views
4

같은 세 가지 기능을 인 -함수 포인터를 C++ 함수에 전달하는 방법은 무엇입니까? 여기

float Plus (float a, float b) { return a+b; } 
float Minus (float a, float b) { return a-b; } 
float Multiply(float a, float b) { return a*b; } 

지금 인자 중 하나로서 기능 포인터를 얻어 함수가 -

void Function_Pointer_func(float a, float b, float (*pt2Func)(float, float)) 
{ 
    float result = pt2Func(a, b); // call using function pointer 

    cout << " Result = "; // display result 
    cout << result << endl; 
} 

및 상기 함수 "Function_Pointer_func"를 호출은 함수는 함수 위에 수행하는 기능 "Function_Pointer_func"로 잘 작동 AR로 함수 포인터를 취 왜

void Replace() 
{ 
    Function_Pointer_func(2, 5, /* pointer to function 'Minus' */ Plus);//// (1) 
    Function_Pointer_func(2, 5, /* pointer to function 'Minus' */ &Minus);//// (2) 

} 

아래 작성 기념물. 그리고 우리는 (A, B) (* pt2Func)에 의해 라인 기능 "Function_Pointer_func"의

float result = pt2Func(a, b); // call using function pointer 

에 우를 대체 할 경우, 다음 또한 작동하지만 (& pt2Func)에 대한 (A, B);

는 VS2008의 오류를 제공

:

"오류 C2064 : 용어는 2 개 인자 복용 함수에 평가하지 않습니다"이제 부동 "의 인수에 교체

을 (* pt2Func) (부동, 플로트) 플로트에 의해 Function_Pointer_func ""기능에서 "(pt2Func) (부동, 플로트) 다음 세 가지

float result = pt2Func(a, b); // 
float result = (&pt2Func)(a, b); // 
float result = (*pt2Func)(a, b); // 

문 작품, 왜? 필자는 불편한 점이 function-pointer에 대한 핵심 이해를 이해하기를 바란다. 음, 나는 Q를 제시하지 않습니까? 어떤 양의 독서도없이 그렇습니다. 그렇습니다. 이에 대한 집중적 인 연구를하지 않았으니,이 점에 관해서는 다소 모호합니다.

미리 도움을 주셔서 감사합니다.

+0

완벽하게 좋은'표준 : 플러스 ', 자신을 쓸 필요가 이미 있습니다. – MSalters

+0

세 가지 유형 모두를 작동하는 이유를 지적하기 위해 @RiaD가 msvc의 버그/기능 일 수 있습니다. 의심의 여지는 없지만 다른 컴파일러와 똑같이 보일 것입니다. – zeal

답변

2

함수는 자동으로 함수 포인터로 감소합니다. 지정되지 않은 경우 그 맥락에서 ,

  • function_name 정말 &function_name 의미한다.

  • &function_name은 함수를 포인터로 변환합니다.

  • *function_name 정말 위의 당 *(&function_name)된다 *(function_name)을 의미한다. *&은 "취소"되므로 말하면 function_name은 다시 &function_name으로 붕괴합니다.

+0

@jrok ok "함수가 자동으로 함수 포인터로 붕괴합니다"라고 말하면 혼란 스러울 지 모르지만 여전히 의심의 여지가 없습니다. 3 번째 문장에서 * function_name은 결국 (& function_name)이되지만 & function_name은 어떨까요. 그리고 함수의 인수 중 하나가 (pt2Func) (float, float)이면 세 가지 유형 모두 이것에 관해서도 의견을 말하십시오. – zeal

+0

@zeal 게스트가 한 말은하지 않았다 :) 어쨌든'f'가 함수 이름 일 때,'& f'는 함수 포인터를 준다. 'f'가 이미 함수 포인터 인 경우,'& f'는 함수 포인터 *에 대한 포인터를 제공하며 함수 호출에서는 사용할 수 없습니다. – jrok

+0

@ruslo : 그는 약간의 점을 가지고 있습니다 : non-call 문맥 (function_name (args)가 아닌'function_name')으로 함수의 이름을 사용하면 일반적으로 함수 주소를 참조합니다 . 하지만 실제로'sizeof (function_name)'은 불법이며'sizeof (& function_name)'은 괜찮습니다. 따라서 확실한 차이가 있습니다. – MSalters

2

그것은 C++ 표준입니다.

float Plus(float a, float b); 
void Function_Pointer_func(float a, float b, float (*pt2Func)(float, float)); 

Function_Pointer_func(2, 5, Plus); // (1) 
... 
float result = pt2Func(a, b); // (2) 

(1) 포인터로 변환 함수 (표준 2003 (4)이다.3)

An lvalue of function type T can be converted to an rvalue of 
type “pointer to T.” The result is a pointer to the function 

2은 함수 호출 (표준 2003 5.2.2)

For an ordinary function call, the postfix expression shall be either 
an lvalue that refers to a function (in which case the function-to-pointer 
standard conversion (4.3) is suppressed on the postfix expression), or it 
shall have pointer to function type. 

[UPDATE] 상세 :

void Replace() { 
    Function_Pointer_func(2, 5, Plus); 
    Function_Pointer_func(2, 5, &Minus); 
} 

빼기은 기능입니다. =>& 마이너스은 함수를 가리키는 포인터이므로 Function_Pointer_func의 3 번째 인수 은 완벽하게 맞지 않습니다. 플러스은 함수이므로 Function_Pointer_func에 꼭 맞게 포인터로 변환해야합니다. 표준 (1)은 자동으로 수행 할 수 있다고 말합니다.

전화의 경우 :

void Function_Pointer_func(float a, float b, float (*pt2Func)(float, float)) { 
    float result = pt2Func(a, b); // call by pointer, see (2) 
    float result = (*pt2Func)(a, b); // convert pointer to function, so 'normal' call 
    float result = (&pt2Func)(a, b); // pointer to function pointer, nope, will not work 
} 
+0

나는 당신의 답을 이해하지 못한다. 잠시 시간을내어 설명을하거나 약간의 참고서를 제공한다. – zeal

관련 문제