【发布时间】:2018-06-08 16:50:53
【问题描述】:
// 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 不指向DISPATCH_FUNCTION,因为它是static 数据成员。我有许多不同类型的cmd,所以我无法将PtrToCmdObj 转换为特定类型来访问DISPATCH_FUNCTION。
有什么方法可以将void* 转换为DispatchFn 类型并在事先不知道cmd 类型的情况下调用DISPATCH_FUNCTION
【问题讨论】:
-
在第一种情况下,指针本身无关紧要,只有它的类型很重要。基本上和写
cmd::DISPATCH_FUNCTION是一样的。如果事先不知道cmd的类型,就无法定位其静态成员函数。 C++ 没有(内置)反射机制。