代码之家  ›  专栏  ›  技术社区  ›  Cem Kalyoncu

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

  •  0
  • Cem Kalyoncu  · 技术社区  · 15 年前

    我试图比较两个函数的地址是否相等。我的存储函数的类型是已知的。此系统正常工作,请考虑以下代码(不是程序中的示例):

    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 回复  |  直到 15 年前
        1
  •  5
  •   Cheers and hth. - Alf    15 年前

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

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

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

        2
  •  2
  •   Puppy    15 年前

    推荐文章