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

Cem*_*ncu 0 c++ function-pointers

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

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

  if(fn==fn2)
     return true;
}
Run Code Online (Sandbox Code Playgroud)

但是,当考虑类函数时,相同的方法不起作用.

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;
}
Run Code Online (Sandbox Code Playgroud)

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

virtual bool compare(void*) = 0;
Run Code Online (Sandbox Code Playgroud)

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

提前谢谢,Cem

Che*_*Alf 5

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

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

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

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

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

干杯&hth.,

  • @Cem:如果你试图仅通过函数指针识别,那么它不是唯一的.但通常你也会存储调用函数的对象,它们将是唯一的.但是,更好的方法是将目标和成员函数包装在仿函数对象中.您可以使用纯虚函数定义一个用于调用的接口(即`operator()`和比较),然后使用具有模板类的具体实例.这是用C++解决这个问题的类型安全方法. (3认同)