2009-03-05 4 views
2

이것은 일관성이없는 것처럼 보입니다. Example :: func 대신에 & Example :: func를 사용하는 이유는 무엇입니까? Example :: func 또는 & exampleFunction을 사용합니까? Example : func을 제외시키기 위해 함수에 대한 참조를 만들 수있는 것처럼 보이지 않습니다. 그리고 나는 example3211이 이미 포인터를 반환하기 때문에 & exampleFunction을 사용하는 방법을 생각하지 않습니다.거기에 & func 또는 class :: func에서 C++을 사용합니까?

#include <iostream> 
class Example { 
public: 
    void func() { std::cout <<"print me\n"; } 
}; 
void exampleFunction() { std::cout << "print me too\n"; } 
typedef void (Example::*ExampleFunc_t)(); 
typedef void (*ExampleFunction_t)(); 
int main() 
{ 
    Example e; 
    ExampleFunc_t  f = &Example::func; 
    ExampleFunction_t f2 = exampleFunction; 
    (e.*f)(); 
    f2(); 
    return 0; 
} 

답변

6

표준이 함수에 대한 포인터를 정의하는 방법입니다.

함수에 대한 포인터를 얻으려면 항상 주소 연산자 &을 사용해야하지만 일반 함수와 정적 멤버 함수의 경우 함수에서 포인터로 함수로의 암시 적 변환이 표준에 정의되어 있습니다.

비 정적 멤버 함수에 대한 lvalue를 얻을 수 없기 때문에 (비 정적) 멤버 함수에 대해서는 정의되지 않았습니다. C++ 표준에서

: 함수 타입 T의 좌변은 T에 입력 "포인터의 r- 수치로 변환 할 수

  1. 4.3 기능 간 포인터 변환. 결과는 함수에 대한 포인터입니다. 각주 (52)

:

비 정적 멤버 함수를 의미 좌변을 얻을 수 없기 때문 변환 비 정적 멤버 함수에 적용하지 않았다.

나는 그들이 아니라 단지 암시 적 변환은 단순히 C 유산의 유물임을 일관성 이유로, & 기능을 허용하지만 거라고 생각 ... C에서

+0

는 ++도 참조 (형식 정의가 작동하는 void (& FuncRef_t)()), 멤버 함수 참조가 아닙니다. – dalle

+0

네, 함수를 암시 적으로 변환하는 것이 유용하다고 생각합니다. 왜냐하면 대부분의 경우 포인터를 전달하기를 원하기 때문입니다 (함수를 전달할 수 없기 때문에 암시 적 변환을 통해 포인터를 전달합니다). 그 이유는 T :: f가 모호 할 수 있기 때문에 충분하지 않다는 것입니다. –

+0

멤버 함수 포인터가 이미 있으면 Base :: f();를 쓸 수 없습니다. 기본 클래스 함수를 호출합니다. (this -> * Base :: f)();를 써야합니다. 어느 정도 빤다. 따라서 & T :: foo를 사용하면 포인터를 얻는 것이 좋은 해결책이라고 생각합니다. –

1

요점은 Function Pointers입니다. :: 종류 사용되는 표준 여기

struct CL { 
    int x, y, z; 
}; 

bool sort_by_x(const CL& obj1, const CL& obj2); 
bool sort_by_y(const CL& obj1, const CL& obj2); 
bool sort_by_z(const CL& obj1, const CL& obj2); 

... 

CL obj[100]; 
... 
sort(obj, obj+100, sort_by_x); 
... 
sort(obj, obj+100, sort_by_y); 
... 
sort(obj, obj+100, sort_by_z); 

: 매우 거친 예를 들어, 다음과 같은 해당 클래스 형의 배열의 요소 정렬해야 할 수있는 여러 멤버 변수를 갖는 클래스를 가지고 가정 CL 오브젝트의 h 열을 정렬합니다. 세 번째 매개 변수를 보면 함수의 이름입니다. std :: sort 함수는 세 번째 매개 변수에서 함수 포인터를 가져 와서 해당 함수를 비교 자로 사용하여 배열을 정렬 할 수 있습니다. std :: sort가 예상대로 작동하도록 sort_by_ * 함수를 정의하는 방법은 우리에게 달려 있습니다.