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++ では、関数ポインターは相対的に比較できません。等価比較はサポートされていますが、ポインターの少なくとも 1 つが実際に仮想メンバー関数を指している場合 (この場合、結果は指定されていません) を除きます。

もちろん、比較述語を実装し、ポインターを明示的に比較することで、いつでも順序付けを導入できます (ただし、等価比較しか使用できないため、あまり洗練されていないように見えます)。他の可能な解決策は、さまざまな実装固有の「ハック」の領域に侵入します。

于 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 に答える