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