4

こんにちは、クラスのメンバーのオフセットを計算することが (C++ によって) 標準であるかどうかを調べようとしています (それを元に戻すため)。

class A
{
public:
    int a, b, c, d;
};

template <typename ParentClass, typename T>
ParentClass const * offset_this_pointer(T const * member_ptr, T ParentClass::* offset)
{
    ParentClass const * parent_p = nullptr;
    // we are technically dereferencing a NULL pointer here,
    // but we are not using the result, only taking the address of it
    // This works and yields the desired result in MSVC 2010, gcc 4.9.2 and Solaris10 compilers.
    T const * offset_p = &(parent_p->*offset);

    return reinterpret_cast<ParentClass const *>((uintptr_t)member_ptr - (uintptr_t)(offset_p));
}

int main()
{
    A a;

    assert(&a == offset_this_pointer(&a.b, &A::b)); // passes

    return 0;
}

&(parent_p->*offset)であることをC++で行うことは合法parent_pですnullptrか?

4

1 に答える 1

1

しばらく議論されてきましたが、明確な結果はありません。ただし、この議論は、実装が提供し、標準に祝福されたoffsetofマクロでは意味がありません。

于 2016-04-07T15:33:10.640 に答える