我试图比较两个函数的地址是否相等。我存储的函数的类型是已知的。这个系统通常有效,请考虑以下代码(不是从程序中写成样本):
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
答案 0 :(得分:5)
Posix需要能够将函数指针转换为void*
。标准C ++不支持它。
成员函数指针不是通常意义上的指针,它们更像是偏移量(即使对于非虚拟成员函数)。
即使比较和强制转换有效,您为compare
显示的两个实现都将具有未定义的行为,因为在指针不比较相等的情况下它们无法返回任何内容。而不是if(blah == bag){ return true; }
只需return (blah == bah);
。
问题源于丢弃必要的类型信息。这通常不是一个好主意。你为什么要丢弃你需要的类型信息?
解决方案:(1)不要丢弃必要的类型信息,和(2)重新设计以摆脱compare
函数。还要注意Roger Pate的评论,看来你似乎在问一个特定的尝试解决方案而不是问题。有什么问题?
干杯&第h。,
答案 1 :(得分:2)
这不起作用,因为成员函数指针实际上不能转换为常规指针 - 它们的大小是未定义的。在某些类层次结构的一些实现中,成员函数指针的大小可以是常规指针的五倍。这与void *?
的比较有什么用呢?