在C ++中,是否可以为成员函数指针定义排序顺序?似乎运营商<未定义。此外,施放到void *是违法的。
class A
{
public:
void Test1(){}
void Test2(){}
};
int main()
{
void (A::* const one)() = &A::Test1;
void (A::* const two)() = &A::Test2;
bool equal = one == two; //Equality works fine.
bool less = one < two; //Less than doesn't.
return 0;
}
谢谢!
答案 0 :(得分:6)
函数指针在C ++中没有关系可比性。支持等式比较,除了至少有一个指针实际指向虚拟成员函数的情况(在这种情况下结果未指定)。
当然,您总是可以通过实现比较谓词并明确比较指针来引入排序(虽然看起来不会太优雅,因为您只能使用相等比较)。其他可能的解决方案将跨越各种特定于实现的“黑客”领域。
答案 1 :(得分:3)
成员函数指针不是实际指针。你应该把它们视为不透明的结构。方法指针包含什么:
struct method_pointer {
bool method_is_virtual;
union {
unsigned vtable_offset; // for a virtual function, need the vtable entry
void* function_pointer; // otherwise need the pointer to the concrete method
}
};
如果你可以将它转换为void *(你不能),那么你所拥有的只是指向结构的指针,而不是指向代码的指针。这就是运算符&lt;()未定义的原因,因为struct指针的值就是它在内存中的位置。
除此之外,你还在排序什么?