获取成员函数的内存地址?

新手上路,请多包涵

如何在 C++ 中获取成员函数的 绝对 地址? (我需要这个来思考。)

成员函数指针不起作用,因为我无法将它们转换为绝对地址( void * )——我需要知道内存中实际函数的地址,而不仅仅是相对于类型的地址。

原文由 user541686 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

在 MSVC 中存在获取成员函数地址的语法(从 MSVC 2005 恕我直言开始)。但这很棘手。而且,获得的指针不可能通过常规方式转换为其他指针类型。尽管有一种方法可以做到这一点。

这是示例:

 // class declaration
class MyClass
{
public:
    void Func();
    void Func(int a, int b);
};

// get the pointer to the member function
void (__thiscall MyClass::* pFunc)(int, int) = &MyClass::Func;

// naive pointer cast
void* pPtr = (void*) pFunc; // oops! this doesn't compile!

// another try
void* pPtr = reinterpret_cast<void*>(pFunc); // Damn! Still doesn't compile (why?!)

// tricky cast
void* pPtr = (void*&) pFunc; // this works

即使使用 reinterpret_cast 常规演员表也不起作用,这一事实可能意味着 MS 并不强烈推荐这种演员表。

不过你可以这样做。当然,这都是依赖于实现的,你必须知道适当的调用约定来做 thunking + 有适当的汇编技能。

原文由 valdo 发布,翻译遵循 CC BY-SA 3.0 许可协议

尝试这个。应该让您将任何东西投射到任何东西上:)

 template<typename OUT, typename IN>
OUT ForceCast( IN in )
{
    union
    {
        IN  in;
        OUT out;
    }
    u = { in };

    return u.out;
};

然后

void* member_address = ForceCast<void*>(&SomeClass::SomeMethod);

原文由 HaPpY 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题