0
// a.h
typedef void (*DispatchFn)(void);
struct cmd {
static const DispatchFn DISPATCH_FUNCTION;
int ID;
};
// a.cpp
void Foo()
{
}
const DispatchFn cmd::DISPATCH_FUNCTION = &Foo;
cmd *CmdObject = (cmd *)(BufferOfMemory);
CmdObject->ID = 6969;
void *PtrToCmdObj = (void *)CmdObject;
void Process()
{
DispatchFn Fn1 = ((cmd *)(PtrToCmdObj))->DISPATCH_FUNCTION; // <-- This points to DISPATCH_FUNCTION
Fn1();
DispatchFn Fn2 = (DispatchFn)(PtrToCmdObj); // <-- This doesn't points to DISPATCH_FUNCTION, but points to ID
Fn2();
}
Fn2
은 static
데이터 멤버이므로 DISPATCH_FUNCTION
을 가리키고 있지 않습니다. 나는 다양한 유형의 cmd
을 가지고 있으므로 에 액세스하려면 특정 유형으로 PtrToCmdObj
을 캐스트 할 수 없습니다.구조체의 정적 데이터 멤버에 액세스하기 위해 void *를 캐스팅하는 방법은 무엇입니까?
나는 void*
DispatchFn
에 형식을 캐스팅 내가 템플릿을 사용하는 것이 일반적인 일을해야하는 경우
아니요, 없습니다. [이제 우리는 Y를 방해하지 않고, X는 무엇입니까?] (https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)? – StoryTeller
첫 번째 경우 포인터 자체는 관련이 없으며 형식 만 중요합니다. 기본적으로'cmd :: DISPATCH_FUNCTION'을 쓰는 것과 같습니다. 미리'cmd'의 타입을 알지 못하면 정적 멤버 함수를 찾을 방법이 없습니다. C++에는 반사 메커니즘이 내장되어 있지 않습니다. – VTT