C ++에 & func 또는 class :: func에 대한 사용이 있습니까?
-
03-07-2019 - |
문제
이것은 일관성이없는 것 같습니다. 예제 :: 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 기능-포인터 변환
- 함수 유형 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_* 함수를 정의하는 방법은 우리에게 달려 있습니다.