5

在 C++ 中,是否可以为指向成员函数的指针定义排序顺序?似乎 operator< 未定义。此外,强制转换为 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;
}

谢谢!

4

2 回答 2

7

函数指针在 C++ 中是不可比较的。支持相等比较,除非至少有一个指针实际指向虚拟成员函数(在这种情况下结果未指定)。

当然,您始终可以通过实现比较谓词并显式比较指针来引入排序(虽然看起来不太优雅,因为您只能使用相等比较)。其他可能的解决方案将进入各种特定于实施的“黑客”领域。

于 2009-11-19T18:25:16.937 回答
4

成员函数指针不是实际指针。您应该将它们视为不透明的结构。方法指针包含什么:

 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* (您不能),那么您将拥有的只是结构的指针,而不是指向代码的指针。这就是为什么 operator<() 也未定义的原因,因为结构指针的值恰好是它在内存中的位置。

除此之外,你按什么排序?

于 2009-11-19T18:29:48.767 回答