代码之家  ›  专栏  ›  技术社区  ›  Imbue

C++比较成员函数指针

  •  4
  • Imbue  · 技术社区  · 15 年前

    在C++中,可以定义指向成员函数指针的排序顺序吗?似乎操作员<未定义。此外,强制作废是违法的*。

    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 回复  |  直到 15 年前
        1
  •  6
  •   AnT stands with Russia    15 年前

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

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

        2
  •  2
  •   jmucchiello    15 年前

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

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

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