1

해결할 특정 문제가 있습니다. 수행 할 정보 나 예제를 찾을 수 없기 때문에 가능한지 확실하지 않습니다. .파생 클래스의 멤버 함수에 대한 포인터이지만 파생 된 (가상) 함수가 아닙니다.

class ParentObject {}; 

class DerivedObject : public ParentObject 
{ 
    void myFunction(){} 
}; 

class OtherDerivedObject 
{ 
    void myOtherFunction(){} 
}; 

및 ParentObject에 대한 함수 포인터 :: *를 원하고 그 중 하나를 파생 클래스에서 기능을 할 수 있습니다 는 기본적으로, 나는이있다. 그렇게하고 싶은에 대한 나의 이유는 내가 다른 클래스

class functionRegistry 
{ 
    std::map<string, *functionPoint> functionMap; 
} 

및 각 개체가 (이상적으로 ParentObject의를하지만 파생 개체 필요한 경우 개별적으로 할 수 있음) functionRegistry의 인스턴스를 가지고 있고, 나는에 functionPoint 필요 DerivedObject 또는 OtherDerivedObject 유형의 객체에서 함수를 가리킬 수 있어야합니다. 사전

+3

저에게 [고전적인 XY 문제] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)처럼 보입니다. – YSC

+0

유스 케이스가 무엇인지 자세히 설명해 주시겠습니까? –

+0

좋아, 지금은 솔루션을 가지고 있지만 관심사를 위해 : 구성 요소가 간단한 메시지를 통해 서로 이야기하는 구성 요소 기반 아키텍처를 사용하는 게임 엔진을 작성 중입니다. 메시지는 FORCE_X + 50과 같이 메시지를 구문 분석합니다. 함수와 상관 관계가있는 전반과 인수가 될 두 번째 요소입니다. 기능을 제공합니다.서로 다른 구성 요소는 서로 다른 메시지를 사용하고 서로 다른 작업을 수행합니다. – ChrysmPsy

답변

2

에서

감사합니다 당신이 필요로하는 올바른 유형의지도를 채울 수 static_cast이다. 이것과

using pfunc_type = void (ParentObject::*)() ; 
pfunc_type pfunc1 = static_cast<pfunc_type>(&DerivedObject::myFunction); 

는 표준에 의해 허용된다

[expr.static.cast/12] - §5.2.9¶12

타입 D의 부재 포인터 '유형의 prvalue cv1 T "는 의 prvalue를"type Cv2 T의 B 멤버에 대한 포인터 "로 변환 할 수 있습니다. 여기서 B는 Cv2가 인 경우 D의 기본 클래스 (절 [class.derived])입니다. 동일한 cv- 자격으로, 또는 gr cv1.72보다 eater cv-qualification "T 유형의 B 구성원에 대한 포인터" "T 유형의 D 구성원에 대한 포인터"에 대한 유효한 표준 변환이 존재하지 않으면 ([conv.mem]), 프로그램 부적절하다. null 멤버 포인터 값 ([conv.mem])은 을 대상 유형의 null 멤버 포인터 값으로 변환합니다. 클래스 에 원래 멤버가 들어 있거나 원래 멤버가 포함 된 클래스의 기본 클래스 또는 파생 클래스 인 경우 멤버에 대한 결과 포인터는 원래 멤버를 가리 킵니다. 그렇지 않으면 동작이 정의되지 않습니다. [ 참고 : 클래스 B에는 원래 멤버가 포함될 필요가 없지만 포인터 을 통해 멤버에 대한 간접 참조가 수행되는 동적 유형의 개체에는 원본 멤버가 있어야합니다. [expr.mptr.oper]를 참조하십시오. - 엔드 노트]

그러나이 허용하는 동안, 당신은 당신이 올바른 동적 유형의 객체에 멤버 포인터를 적용해야합니다 매우주의 해야합니다.

+0

우수,이 트릭을 완료 한 것, 감사합니다! – ChrysmPsy

+0

왜 동작이 정의되지 않습니까? 컴파일 오류가 아닌 이유는 무엇입니까? – Mikhail

+0

@Mikhail - 포인터를 기본 클래스의 멤버 함수로 받아들이는 함수와 기본 클래스 객체를 가리키는 포인터로 가정합니다. 이 제약 조건을 컴파일 할 때 어떻게 확인하겠습니까? – StoryTeller