문제

이것은 일관성이없는 것 같습니다. 예제 :: func 대신 왜 우리가 사용하고 exase :: func를 사용합니까? 예를 들어 :: func 또는 & exampleFunction과 같은 사용이 있습니까? 예제 :: func를 배제하도록 함수를 참조 할 수있는 것 같지는 않습니다. 그리고 ExampleFunction이 이미 포인터를 반환하기 때문에 사용 및 예제 기능을 사용하는 방법을 생각할 수 없습니다.

#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;
} 
도움이 되었습니까?

해결책

이것이 표준이 기능에 대한 포인터를 정의하는 방식이기 때문입니다.

실제로 항상 주소 연산자를 사용해야합니다 & 함수에 대한 포인터를 얻지 만 일반 함수 및 정적 멤버 함수의 경우 함수에서 포인터 간 기능으로의 암시 적 변환이 표준에 정의됩니다.

정적이 아닌 멤

C ++ 표준에서 :

4.3 기능-포인터 변환

  1. 함수 유형 t의 lValue는 "t to t"유형의 rvalue로 변환 될 수 있습니다. 결과는 기능에 대한 포인터입니다.

각주 52 :

이 변환은 비 정적 멤버 함수에 적용되지 않습니다. 비 정적 멤버 함수를 지칭하는 LValue는 얻을 수 없기 때문입니다.

나는 그들이 일관성있는 이유 때문에 오히려 기능 만 허용하고 있다고 생각하지만 암시 적 변환은 단순히 C 유산의 인공물이라고 생각합니다 ...

다른 팁

요점은 사용 중입니다 기능 포인터. 매우 거친 예를 들어, 여러 멤버 변수가있는 클래스가 있다고 가정 해 봅시다.

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);

여기서 std :: 정렬은 CL 객체의 배열을 정렬하는 데 사용됩니다. 세 번째 매개 변수를보십시오. 함수 이름입니다. STD :: SORT 함수는 세 번째 매개 변수에서 함수 포인터를 가져갈 수 있으며 해당 기능을 비교기로 사용하여 배열을 정렬 할 수 있습니다. std :: sort가 예상대로 작동하도록 sort_by_* 함수를 정의하는 방법은 우리에게 달려 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top