将类函数指针转换为void *,反之亦然

时间:2010-10-31 11:56:25

标签: c++ function-pointers

我试图比较两个函数的地址是否相等。我存储的函数的类型是已知的。这个系统通常有效,请考虑以下代码(不是从程序中写成样本):

virtual bool compare(void *fn2) {
  void (*fn)(int);

  if(fn==fn2)
     return true;
}

但是当考虑类功能时,相同的方法不起作用。

virtual bool compare(void *fn2) {
  void(__thiscall myclass::*fn)(int);
  void *fn2;

  if(fn==fn2)  //error C2440 type cast: cannot convert void* to void(__thiscall...
     return true;
}

这些函数覆盖了一个公共基类的纯虚函数,类似于以下内容:

virtual bool compare(void*) = 0;

由于我无法使用模板<>在虚拟功能中,我没有选择权。有没有办法(无论如何)统一类功能和常规功能?

提前致谢, CEM

2 个答案:

答案 0 :(得分:5)

Posix需要能够将函数指针转换为void*。标准C ++不支持它。

成员函数指针不是通常意义上的指针,它们更像是偏移量(即使对于非虚拟成员函数)。

即使比较和强制转换有效,您为compare显示的两个实现都将具有未定义的行为,因为在指针不比较相等的情况下它们无法返回任何内容。而不是if(blah == bag){ return true; }只需return (blah == bah);

问题源于丢弃必要的类型信息。这通常不是一个好主意。你为什么要丢弃你需要的类型信息?

解决方案:(1)不要丢弃必要的类型信息,(2)重新设计以摆脱compare函数。还要注意Roger Pate的评论,看来你似乎在问一个特定的尝试解决方案而不是问题。有什么问题?

干杯&第h。,

答案 1 :(得分:2)

这不起作用,因为成员函数指针实际上不能转换为常规指针 - 它们的大小是未定义的。在某些类层次结构的一些实现中,成员函数指针的大小可以是常规指针的五倍。这与void *?

的比较有什么用呢?