方法指针转换

时间:2011-06-10 14:13:25

标签: c++

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

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

我需要存储指向来自不同类和不同参数列表的方法的指针。起初我只想将方法指针强制转换为void *,但编译器因无效的转换错误而死亡。结果是sizeof(methodPtr)== 8(这里是32位系统),但是转换为无符号long long也会失败(相同的编译器错误 - 无效的转换)。如何普遍存储方法指针呢?

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

2 个答案:

答案 0 :(得分:4)

你没有。如果需要抽象,则使用运行时继承,并创建一个根据必需品进行模板化的派生类,或者最好通过使用函数创建一个普通的旧仿函数。查看boost::bindboost::function(两者都在C ++ 0x标准中),了解它应该如何完成 - 无论如何你可以阅读所有宏观混乱。

答案 1 :(得分:1)

你最好听DeadMG。问题是,成员指针的大小取决于要为其构成成员指针的类类型。这是因为,因为取决于类布局的类型(例如,如果类具有虚拟基础等),成员指针必须包含各种偏移调整值 - 没有“一个适合所有”的成员指针类型,你可以指望。这也意味着,你不能假设有一个“可投射”的整数类型,它可以容纳每个可能的成员函数指针。