C ++比较成员函数指针

时间:2009-11-19 18:19:39

标签: c++ pointers member-function-pointers

在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;
}

谢谢!

2 个答案:

答案 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指针的值就是它在内存中的位置。

除此之外,你还在排序什么?