方法指针转换

Posted

技术标签:

【中文标题】方法指针转换【英文标题】:Method pointer casting 【发布时间】:2011-06-10 14:13:25 【问题描述】:

我正在编写一个用于教育目的的委托课程,但遇到了一个小问题。委托不仅要能够调用函数,还要能够调用对象的成员方法,这意味着我需要存储一个指向方法的指针:

void (classname::*methodPtr)(...);

我需要存储指向来自不同类和不同参数列表的方法的指针。起初我只是想将为 void *,但编译器因无效转换错误而死。原来 sizeof(methodPtr) == 8 (此处为 32 位系统),但转换为 unsigned long long 也失败(相同的编译器错误 - 无效转换)。那么如何通用存储方法指针呢?

我知道这不安全 - 我有其他安全机制,请专注于我的问题。

【问题讨论】:

【参考方案1】:

你没有。如果您需要抽象,您可以使用运行时继承,并创建一个以必需品为模板的派生类,或者最好通过使用函数创建一个普通的旧仿函数。查看boost::bindboost::function(均在C++0x 标准中)了解应该如何完成——如果你能在所有宏混乱的情况下阅读它们的话。

【讨论】:

好的,让我检查一下我是否理解正确 - 你建议我应该使用虚拟 operator() 为委托创建一个基类,然后从它派生一个模板化的基类?你所说的仿函数是指一个相应地调用该方法的模板函数吗?我最初使用此解决方案,但它有两个缺点 - 编译器需要在编译时了解所有内容,因此仅支持静态对象,并且每个对象都创建一个模板化函数的实例。 @IneQuation:是的。我不知道您所说的仅静态对象是什么意思 - 可以使用通过 operator() 支持正确签名的 C++ 中的任何对象,并且没有未知的对象。【参考方案2】:

你最好听听 DeadMG。问题是,成员指针的大小取决于您要为其形成成员指针的类类型。之所以如此,是因为根据类布局的类型(例如,如果类具有虚拟基等),成员指针必须包含各种偏移调整值 - 没有“一刀切”的成员指针类型可以指望。这也意味着,你不能假设有一个“可转换的”整数类型可以保存每个可能的成员函数指针。

【讨论】:

以上是关于方法指针转换的主要内容,如果未能解决你的问题,请参考以下文章

易语言指针转换及调用方法

有没有合法的方法将 unsigned char 指针转换为 std::byte 指针?

将cpp函数指针转换为java接口方法

如何将地址转换为函数指针以调用方法

在方法中返回向上转换的指针时替代堆分配

将指针从派生类转换为基类的最佳方法